gencode_ddd:集成项目管理与代码生成的DDD工具

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:gencode_ddd是一个结合项目管理和代码生成器功能的工具,基于Java平台,致力于提高软件开发的效率。它允许开发者利用领域驱动设计(DDD)原则快速构建系统,通过自动化生成符合DDD模式的代码来减少重复工作,同时提供项目管理工具来优化开发流程。本文深入解析了该项目的核心特点、工作原理及其在开发流程中的有效应用。 gencode_ddd:一个项目管理带代码生成器项目

1. gencode_ddd项目概述

在当今的软件开发领域中,快速、高效地生成高质量代码的能力已经成为衡量开发团队竞争力的重要指标之一。我们的gencode_ddd项目旨在解决这一行业痛点,该项目以领域驱动设计(DDD)为理论指导,结合Java平台的成熟优势,提供了一套自动化代码生成器,大幅降低了传统编码工作中的重复劳动。gencode_ddd不仅仅是一个工具,它还包括了项目管理功能,进一步提升了开发流程的效率和一致性。本文将对gencode_ddd项目进行深入解析,探讨它的工作原理、功能实现及其在提高软件开发效率方面的优化策略。

2. Java平台开发与领域驱动设计

2.1 Java平台开发基础

2.1.1 Java开发环境配置

在深入理解Java开发之前,确保拥有一个适合开发的环境是必要的第一步。Java开发环境主要由JDK(Java Development Kit)和IDE(Integrated Development Environment)组成。JDK是Java程序设计的核心,包含了Java运行环境(JRE)、编译器(javac)、文档生成器(javadoc)及其他工具。开发者需要根据操作系统下载相应的JDK版本并安装,同时设置JAVA_HOME环境变量,以及将JDK的bin目录加入到系统的PATH变量中。

安装完毕后,需要通过命令行验证JDK安装是否成功,如下代码块展示如何验证:

java -version
javac -version

当输入上述命令没有报错,并且能看到正确的版本号时,表示环境配置成功。在本节中,我们了解到JDK和IDE是开发Java应用的基石。选择合适的IDE,比如IntelliJ IDEA或Eclipse,可以帮助开发者提升编码、调试以及管理依赖的效率。IDE通常会提供代码自动完成、错误检测、版本控制集成等高级特性,对于提高开发效率至关重要。

2.1.2 Java核心概念与特性

Java之所以能够成为广泛使用的编程语言,与其核心概念和特性是分不开的。核心概念如面向对象编程(OOP),封装、继承、多态是其语言特性的基础。Java是一种平台无关性语言,它通过字节码(.class文件)在JVM(Java Virtual Machine)上运行,确保了"一次编写,到处运行"的理念。

在本节,我们着重理解Java的几个重要特性:

  • 垃圾回收:Java提供自动垃圾回收机制,减少了内存泄漏等错误的发生,让开发者可以更专注于业务逻辑。
  • 异常处理:Java使用异常处理机制,将错误处理与正常代码逻辑分离,提高了程序的可读性和健壮性。
  • 多线程与并发:Java内建对多线程编程的支持,使得构建并发程序成为可能,这在现代多核处理器的硬件架构中尤为重要。
  • 集合框架:Java提供了丰富的集合类,如List、Set、Map等,这些类为处理数据集合提供了极大的便利。

下面的代码块展示了一个简单的Java程序,它使用了集合框架中的List和异常处理机制:

import java.util.ArrayList;
import java.util.List;

public class JavaBasics {
    public static void main(String[] args) {
        List<String> myList = new ArrayList<>();
        myList.add("Apple");
        myList.add("Banana");
        myList.add("Cherry");

        try {
            System.out.println(myList.get(5)); // 尝试获取不存在的元素,将抛出IndexOutOfBoundsException
        } catch (IndexOutOfBoundsException e) {
            System.out.println("Index out of bounds!");
        }

        System.out.println("End of program");
    }
}

通过上述代码,我们可以看到如何使用Java集合来存储数据,并在出现错误时进行异常处理。Java的这些核心概念和特性不仅构成了它作为开发平台的基础,也为后续的领域驱动设计提供了扎实的支撑。

2.2 领域驱动设计(DDD)原则

2.2.1 DDD基本概念

领域驱动设计(Domain-Driven Design,简称DDD)是一种以领域为核心的关注软件业务逻辑实现的设计方法。DDD的核心思想是紧密围绕业务领域进行软件设计,通过开发和维护领域模型来解决复杂问题。

DDD强调将业务知识和技术实现相结合,包含以下几个关键概念:

  • 领域(Domain):领域是指一个组织所操作的特定业务范畴,是解决软件核心问题的出发点。
  • 子域(Subdomain):由于领域较大,可以细分为多个子域,比如核心域(Core Domain)、支持域(Supporting Domain)和通用域(Generic Domain)。
  • 限界上下文(Bounded Context):一个限界上下文是对领域内的概念进行约束,它定义了模型的边界,同时将模型内部和外部区别开来。
  • 聚合(Aggregate):聚合是相关对象的集合,它定义了数据的一致性边界。
  • 实体(Entity)和值对象(Value Object):实体具有唯一标识符,值对象描述了实体属性的特征。

理解这些概念后,开发者能够构建出更加贴近业务的软件系统。DDD并非一蹴而就,它需要不断的迭代和领域知识的深入理解。以下是DDD设计流程的代码示例,展示了如何定义一个实体和限界上下文:

// 实体类
@Entity
public class Order {
    @Id
    private Long id;
    private Date orderDate;
    // 其他属性、方法和业务逻辑
}

// 限界上下文
@Context
public class SalesContext {
    // SalesContext中的相关类、接口和业务逻辑
}

2.2.2 DDD在项目中的实践应用

DDD的实践应用需要将领域知识转化为软件模型,而这个转化过程往往不是一帆风顺的。实践中,我们遵循一系列最佳实践来指导模型的设计和实现。

在实际项目中,应用DDD通常包括以下几个步骤:

  1. 领域知识探索(Bounded Context Discovery) :首先,通过与领域专家的交流和协作,对业务领域进行深入探索,识别出子域和限界上下文。
  2. 领域模型构建(Model Construction) :根据领域知识创建领域模型,这个模型应该能够准确反映出业务的核心概念和规则。
  3. 模型驱动开发(Model-Driven Design) :开发过程遵循领域模型的指导,使用领域模型驱动软件设计和实现。
  4. 持续集成(Continuous Integration) :确保模型的变化能够及时反映在代码中,保持软件模型与业务模型的一致性。

实践应用中,我们还需要注意几个关键点:

  • 集成与通信 :在不同的限界上下文中,需要定义清晰的集成点和通信协议,以便各个上下文之间能够有效协作。
  • 战术模式与战略模式 :战术模式包括聚合、仓库(Repository)、服务(Service)等,用于指导模型的实现细节。战略模式包括上下文映射、领域事件等,用于指导限界上下文之间的关系。
  • 持续重构 :随着业务的变化,持续重构领域模型和代码以保持其简洁和清晰。

下面的代码块展示了一个战术模式的示例——使用仓库模式来处理数据持久化:

// 仓库接口
public interface OrderRepository {
    Order findById(Long id);
    void save(Order order);
}

// 仓库实现
public class JpaOrderRepository implements OrderRepository {
    @Override
    public Order findById(Long id) {
        // 实现查找逻辑
    }

    @Override
    public void save(Order order) {
        // 实现保存逻辑
    }
}

// 服务类
public class OrderService {
    private OrderRepository orderRepository;

    public OrderService(OrderRepository orderRepository) {
        this.orderRepository = orderRepository;
    }

    public void createOrder(Order order) {
        orderRepository.save(order);
    }

    // 其他服务方法
}

在这个示例中,我们看到了仓库模式如何被应用来抽象数据持久化操作。通过这种方式,业务逻辑(OrderService)不再直接依赖于数据持久化机制的细节,提高了代码的可维护性和可测试性。

通过上述实践应用的介绍,我们可以看到DDD并非遥不可及,而是能够在实际项目中落地的一套设计方法。通过对领域知识的深入理解和不断实践,我们可以利用DDD的原则和模式来构建更加符合业务需求的软件系统。

3. 自动化代码生成与项目管理功能

自动化代码生成和项目管理功能是现代软件开发中的关键组成部分,它们能够极大地提高开发效率和项目的可控性。在本章节中,我们将深入探讨自动化代码生成的优越性以及它如何帮助提升项目的管理能力。

3.1 自动化代码生成的优势

3.1.1 减少重复性编码工作

在软件开发过程中,重复性的编码工作是不可避免的,例如创建通用的数据访问层或服务接口。这些任务不仅耗费时间,而且容易产生错误。自动化代码生成的出现,让这些重复工作变得多余,开发人员可以将时间投入到更有价值的工作中,比如设计和实现更复杂的业务逻辑。

以gencode_ddd项目为例,自动化代码生成器可以根据领域模型自动生成常用的CRUD(创建、读取、更新、删除)操作。开发人员只需要简单配置,就可以得到一套完整的后台管理代码,极大地减少了编码工作量。

// 示例代码块:Java Spring Boot框架中一个简单的RESTful服务
@RestController
@RequestMapping("/api/users")
public class UserController {
    private final UserService userService; // 自动注入UserService

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping
    public List<User> getAllUsers() {
        return userService.findAll();
    }
    // ... 其他CRUD操作方法
}

在上述代码中,我们通过使用Spring框架的注解,定义了一个简单的RESTful API。对于这样的操作,如果可以自动生成,那么开发人员就可以避免编写这些重复性的代码,专注于业务逻辑的实现。

3.1.2 提升编码效率与一致性

自动化代码生成不仅减少了重复性编码,还确保了代码的一致性和规范性。当生成的代码遵循同一套标准和模板时,整个项目的代码库将呈现出高度的组织性和统一性。这种一致性有助于代码的维护和团队协作,因为所有开发人员都在遵循相同的编码规则和模式。

flowchart LR
    A[领域模型定义] -->|领域模型| B[代码生成器]
    B --> C[生成CRUD代码]
    B --> D[生成业务逻辑代码]
    B --> E[生成DTO和VO类]
    C --> F[代码规范应用]
    D --> F
    E --> F
    F --> G[保持代码一致性]

如上图所示,领域模型定义通过代码生成器转换为CRUD代码、业务逻辑代码以及DTO(Data Transfer Object)和VO(Value Object)类。生成的代码通过应用统一的代码规范,确保了整个项目的一致性。

3.2 项目管理功能提升开发效率

3.2.1 项目管理功能概述

项目管理功能在软件开发项目中的重要性不言而喻。有效的项目管理可以确保项目按时、按预算、按质量完成。现代项目管理工具,如JIRA、Trello和Asana等,提供了任务跟踪、资源分配、进度监控等功能,这些功能在自动化代码生成的项目中尤为关键。

3.2.2 功能实现的技术细节

要实现高效的项目管理,首先需要确保项目管理工具与开发工具的集成。例如,可以将自动化代码生成器与项目管理工具集成,实现任务自动生成和状态同步。

# Maven pom.xml配置示例,展示如何集成JIRA插件
<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jira-maven-plugin</artifactId>
            <version>2.2</version>
            <configuration>
                <jiraUrl>https://jira.example.com</jiraUrl>
                <jiraUsername>your-username</jiraUsername>
                <jiraPassword>your-password</jiraPassword>
                <projectKey>DDD</projectKey>
            </configuration>
        </plugin>
    </plugins>
</build>

上述配置中, jira-maven-plugin 是一个Maven插件,允许开发者将Maven构建与JIRA项目关联起来,从而可以将构建状态和缺陷信息直接与JIRA任务关联。这意味着每当有新的代码生成任务被处理时,相关的JIRA任务可以自动更新状态,反之亦然。

此外,可以利用Git的钩子(hooks)来自动触发项目管理事件。例如,当代码被推送(push)到Git仓库时,可以触发一个脚本来更新JIRA任务状态。

# Git钩子脚本示例,用于触发JIRA事件
#!/bin/bash
# Check if the push is to the master branch
if [ "$BRANCH" = "master" ]; then
    # Update JIRA issue status
    jira-cli issue "$ISSUE_KEY" --action transition --transition-id "101" --user "$USERNAME" --password "$PASSWORD"
fi

上述脚本在Git钩子中检查是否为master分支的推送,并使用JIRA CLI(命令行接口)来更新相关任务的状态。这种方法可以确保项目管理与代码开发的同步性,进一步提升项目开发效率。

在本章节中,我们探讨了自动化代码生成所带来的减少重复工作和提升编码效率的优势,并讨论了项目管理功能如何与自动化代码生成配合使用,以提高整体开发效率。通过本章节的介绍,我们对如何运用这些技术提升软件开发过程中的效率有了更深刻的理解。在下一章节中,我们将进一步了解代码生成器的工作原理以及它们如何与Spring Boot框架和构建工具如Maven和Gradle整合。

4. 代码生成器与框架集成

4.1 代码生成器的工作原理

代码生成器已经成为现代软件开发中不可或缺的工具,它大大简化了开发者的编码工作,提高了开发效率。在这一部分,我们将深入探讨代码生成器的工作原理,特别是模板技术的应用以及代码模板的创建与管理。

4.1.1 模板技术的应用

模板技术是代码生成器的核心,它允许开发者定义一套规则,将这些规则应用于数据模型,从而快速生成结构化的代码。通过使用不同的模板引擎,如Freemarker、Thymeleaf或Handlebars等,我们可以根据需求生成不同语言的代码,如Java、C#、Python等。

一个典型的模板文件包含了静态文本和模板指令。模板指令用于指定程序动态插入的数据位置以及插入方式。例如,在Java代码生成的场景中,一个简单的模板可能包含如下指令:

package ${packageName};

public class ${className} {
    // 类成员变量和方法
}

在模板中, ${packageName} ${className} 是变量占位符,它们会在模板渲染时被替换为实际的值。模板引擎解析这些指令,并根据提供的数据模型替换为相应的值。

4.1.2 代码模板的创建与管理

代码模板的创建和管理是另一个关键环节。开发者需要根据项目的业务逻辑和架构要求,设计和维护一套合适的模板库。通常,模板库会按照功能、框架和技术栈进行分类和组织。

创建模板需要遵循以下步骤:

  1. 需求分析 :明确需要生成的代码种类和结构。
  2. 模板设计 :设计模板的结构和内容,包括通用的部分和可变的部分。
  3. 模板编写 :使用模板引擎的语法编写模板文件。
  4. 模板测试 :在不同场景下测试模板,确保输出符合预期。
  5. 模板维护 :随着项目需求的变更,不断更新和优化模板库。

下面是一个简单的Java代码模板的例子:

package ${packageName};

${#list fields as field}
private ${field.type} ${field.name};

${/list}

${#list methods as method}
${method.returnType} ${method.name}(${#list method.params as param}${param.type} ${param.name}${/list}) {
    // 方法实现
}
${/list}

在这个模板中, ${#list ... as ...} 是一个循环指令,用于遍历数据模型中的列表。 fields methods 是数据模型中定义的属性列表。在模板渲染时,会根据实际的字段列表和方法列表生成相应的内容。

4.2 Spring Boot与构建工具整合

在这一部分,我们将探讨如何将Spring Boot与常用的构建工具如Maven和Gradle整合,以实现项目的自动化构建和依赖管理。

4.2.1 Spring Boot框架简介

Spring Boot是由Pivotal团队提供的开源框架,它旨在简化新Spring应用的初始搭建以及开发过程。它使用“约定优于配置”的原则,提供了一系列默认配置,从而降低了项目配置的复杂性。Spring Boot支持多种构建工具,包括Maven和Gradle,允许开发者根据自己的喜好和项目需求选择合适的工具。

4.2.2 Maven与Gradle构建工具对比及应用

Maven和Gradle是目前最流行的Java项目构建工具。尽管它们的目的相同,但在设计理念和使用方式上有所不同。

Maven 是基于项目对象模型(POM)的概念,通过声明项目依赖、生命周期管理和插件系统来管理项目。Maven的配置文件 pom.xml 中定义了项目的结构、配置和其他相关信息。

Gradle 则基于Groovy语言,提供了一种更灵活的构建方式。它采用基于任务的构建模型,允许开发者自定义构建逻辑。Gradle的配置文件通常是 build.gradle

下面是一个简单的Maven pom.xml 文件示例:

<project xmlns="http://maven.apache.org/POM/4.0.0" ...>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>spring-boot-demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- 其他依赖 -->
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

而下面是一个简单的Gradle build.gradle 文件示例:

plugins {
    id 'org.springframework.boot' version '2.3.4.RELEASE'
    id 'io.spring.dependency-management' version '1.0.10.RELEASE'
    id 'java'
}

group = 'com.example'
version = '1.0-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    // 其他依赖
}

bootJar {
    archiveFileName = 'spring-boot-demo.jar'
}

在实际的项目中,Spring Boot结合Maven或Gradle可以完成项目的构建、依赖管理、运行和打包等多个环节。开发者只需在配置文件中进行简单的配置,即可享受构建工具提供的强大功能。此外,构建工具还支持插件系统,能够集成代码生成器、测试框架、代码质量检查等多种工具,进一步提升开发效率。

代码生成器与框架和构建工具的整合,实现了从模板创建到项目构建的全流程自动化,极大地优化了软件开发流程。开发者可以专注于实现业务逻辑,而不是重复的编码工作,从而显著提高了开发效率。

5. 增强功能与软件开发效率优化

随着项目的发展,软件功能的增强与开发效率的提升变得尤为重要。本章将探讨如何通过策略实施和需求分析设计来增强现有功能以及迭代新特性。同时,我们会详细探讨软件开发效率的评估方法和提升开发效率的具体实践案例。

5.1 增强现有功能与迭代新特性

5.1.1 功能增强的策略与实施

在软件迭代过程中,增强现有功能是一个不断演进的过程。首先需要对现有系统进行功能分析,明确哪些功能是用户经常使用的,哪些功能需要改进以适应市场变化或技术发展。

// 示例代码:功能增强策略分析
public class FeatureEnhancementStrategy {

    public void analyzeCurrentFeatures(List<Feature> features) {
        features.stream()
                .filter(feature -> feature.getUsageRate() > FEATURE_USAGE_THRESHOLD)
                .forEach(feature -> analyzeFeatureForImprovement(feature));
    }

    private void analyzeFeatureForImprovement(Feature feature) {
        // 评估功能的可改进之处
    }
}

根据分析结果,开发团队可以确定优先级,进行功能增强。实施过程中要确保团队沟通一致,并且通过自动化测试保证新增功能不会影响到现有功能的稳定性。

5.1.2 新特性的需求分析与设计

迭代新特性之前,需求收集和分析是关键步骤。利用用户访谈、问卷调查或市场趋势分析,可以收集到有关新特性的关键需求。

// 示例代码:需求收集与分析
public class FeatureRequest {
    private String requestId;
    private String description;
    private String priority;
    // getter和setter方法
}

需求分析完成后,进行系统设计,设计过程中应当考虑扩展性、维护性以及安全性等因素,设计文档应该详细到能够为编码提供明确指导。

5.2 软件开发效率的持续优化

5.2.1 开发效率评估方法

开发效率是衡量软件开发过程的重要指标,其评估方法通常包括代码行数、功能点分析、完成任务所需时间等。

// 示例代码:开发效率评估工具
public class DevelopmentEfficiencyAnalyzer {

    public double evaluateEfficiency(List<Tasks> tasks, double hoursWorked) {
        double efficiencyScore = tasks.stream()
                                       .mapToDouble(task -> task.getComplexity() / hoursWorked)
                                       .sum();
        return efficiencyScore;
    }
}

这些方法可以帮助识别瓶颈,从而有针对性地进行优化。

5.2.2 效率提升的策略与实践案例

提升开发效率的策略可以包括采用敏捷开发方法、持续集成/持续部署(CI/CD)、自动化测试和代码审查等。实践案例说明,这些策略可以显著减少手工操作,缩短产品从概念到市场的周期。

graph LR
    A[开始] --> B[需求分析]
    B --> C[设计阶段]
    C --> D[编码实现]
    D --> E[自动化测试]
    E --> F[代码审查]
    F --> G[部署上线]
    G --> H[持续集成和持续部署]
    H --> I[反馈与优化]
    I --> J[结束]

下面是一个具体的实践案例:

  • 自动化测试 :引入JUnit和Mockito等测试框架,自动化测试覆盖率从50%提高到80%。
  • 代码审查 :采用SonarQube进行静态代码分析,提高了代码质量和一致性。
  • 持续集成/持续部署 :使用Jenkins实现自动化构建和部署,减少了人工操作错误,缩短了构建时间。

通过这些策略与实践,软件开发团队可以显著提高软件交付速度,同时保持高质量标准。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:gencode_ddd是一个结合项目管理和代码生成器功能的工具,基于Java平台,致力于提高软件开发的效率。它允许开发者利用领域驱动设计(DDD)原则快速构建系统,通过自动化生成符合DDD模式的代码来减少重复工作,同时提供项目管理工具来优化开发流程。本文深入解析了该项目的核心特点、工作原理及其在开发流程中的有效应用。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

``` cc := g++ name := pro workdir := workspace srcdir := src objdir := objs stdcpp := c++11 cuda_home := /datav/software/anaconda3/lib/python3.9/site-packages/trtpy/trt8cuda112cudnn8 syslib := /datav/software/anaconda3/lib/python3.9/site-packages/trtpy/lib cpp_pkg := /datav/software/anaconda3/lib/python3.9/site-packages/trtpy/cpp-packages cuda_arch := nvcc := $(cuda_home)/bin/nvcc -ccbin=$(cc) # 定义cpp的路径查找和依赖项mk文件 cpp_srcs := $(shell find $(srcdir) -name "*.cpp") cpp_objs := $(cpp_srcs:.cpp=.cpp.o) cpp_objs := $(cpp_objs:$(srcdir)/%=$(objdir)/%) cpp_mk := $(cpp_objs:.cpp.o=.cpp.mk) # 定义cu文件的路径查找和依赖项mk文件 cu_srcs := $(shell find $(srcdir) -name "*.cu") cu_objs := $(cu_srcs:.cu=.cu.o) cu_objs := $(cu_objs:$(srcdir)/%=$(objdir)/%) cu_mk := $(cu_objs:.cu.o=.cu.mk) # 定义opencv和cuda需要用到的库文件 link_cuda := cudart cudnn link_trtpro := link_tensorRT := nvinfer nvinfer_plugin link_opencv := link_sys := stdc++ dl protobuf link_librarys := $(link_cuda) $(link_tensorRT) $(link_sys) $(link_opencv) # 定义头文件路径,请注意斜杠后边不能有空格 # 只需要写路径,不需要写-I include_paths := src \ $(cuda_home)/include/cuda \ $(cuda_home)/include/tensorRT \ $(cpp_pkg)/opencv4.2/include \ $(cuda_home)/include/protobuf # 定义库文件路径,只需要写路径,不需要写-L library_paths := $(cuda_home)/lib64 $(syslib) $(cpp_pkg)/opencv4.2/lib # 把library path给拼接为一个字符串,例如a b c => a:b:c # 然后使得LD_LIBRARY_PATH=a:b:c empty := library_path_export := $(subst $(empty) $(empty),:,$(library_paths)) # 把库路径和头文件路径拼接起来成一个,批量自动加-I、-L、-l run_paths := $(foreach item,$(library_paths),-Wl,-rpath=$(item)) include_paths := $(foreach item,$(include_paths),-I$(item)) library_paths := $(foreach item,$(library_paths),-L$(item)) link_librarys := $(foreach item,$(link_librarys),-l$(item)) # 如果是其他显卡,请修改-gencode=arch=compute_75,code=sm_75为对应显卡的能力 # 显卡对应的号码参考这里:https://developer.nvidia.com/zh-cn/cuda-gpus#compute # 如果是 jetson nano,提示找不到-m64指令,请删掉 -m64选项。不影响结果 cpp_compile_flags := -std=$(stdcpp) -w -g -O0 -m64 -fPIC -fopenmp -pthread cu_compile_flags := -std=$(stdcpp) -w -g -O0 -m64 $(cuda_arch) -Xcompiler "$(cpp_compile_flags)" link_flags := -pthread -fopenmp -Wl,-rpath='$$ORIGIN' cpp_compile_flags += $(include_paths) cu_compile_flags += $(include_paths) link_flags += $(library_paths) $(link_librarys) $(run_paths) # 如果头文件修改了,这里的指令可以让他自动编译依赖的cpp或者cu文件 ifneq ($(MAKECMDGOALS), clean) -include $(cpp_mk) $(cu_mk) endif $(name) : $(workdir)/$(name) all : $(name) run : $(name) @cd $(workdir) && ./$(name) $(run_args) $(workdir)/$(name) : $(cpp_objs) $(cu_objs) @echo Link $@ @mkdir -p $(dir $@) @$(cc) $^ -o $@ $(link_flags) $(objdir)/%.cpp.o : $(srcdir)/%.cpp @echo Compile CXX $< @mkdir -p $(dir $@) @$(cc) -c $< -o $@ $(cpp_compile_flags) $(objdir)/%.cu.o : $(srcdir)/%.cu @echo Compile CUDA $< @mkdir -p $(dir $@) @$(nvcc) -c $< -o $@ $(cu_compile_flags) # 编译cpp依赖项,生成mk文件 $(objdir)/%.cpp.mk : $(srcdir)/%.cpp @echo Compile depends C++ $< @mkdir -p $(dir $@) @$(cc) -M $< -MF $@ -MT $(@:.cpp.mk=.cpp.o) $(cpp_compile_flags) # 编译cu文件的依赖项,生成cumk文件 $(objdir)/%.cu.mk : $(srcdir)/%.cu @echo Compile depends CUDA $< @mkdir -p $(dir $@) @$(nvcc) -M $< -MF $@ -MT $(@:.cu.mk=.cu.o) $(cu_compile_flags) # 定义清理指令 clean : @rm -rf $(objdir) $(workdir)/$(name) $(workdir)/*.trtmodel $(workdir)/demo.onnx # 防止符号被当做文件 .PHONY : clean run $(name) # 导出依赖库路径,使得能够运行起来 export LD_LIBRARY_PATH:=$(library_path_export)```empty := library_path_export := $(subst $(empty) $(empty),:,$(library_paths))解释一下,每一行什么意思,具体一些
最新发布
03-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值