如何用Gradle 4+构建多主程序C++项目并指定clang++-5.0编译
解决方案
我会帮你一步步配置Gradle来构建这个C项目,满足你的需求——用clang-5.0编译,分别构建并运行两个主程序。
第一步:项目目录结构
先把你的文件按Gradle C++插件的规范组织起来,这样配置起来更清晰:
your-project/ ├── src/ │ ├── corelib/ # 存放unit1和unit2的代码和头文件 │ │ ├── cpp/ │ │ │ ├── unit1.cpp │ │ │ └── unit2.cpp │ │ └── headers/ │ │ ├── unit1.h │ │ └── unit2.h │ ├── app1/ # 第一个主程序 │ │ └── cpp/ │ │ └── main1.cpp │ └── app2/ # 第二个主程序 │ └── cpp/ │ └── main2.cpp └── build.gradle # Gradle配置文件
第二步:编写build.gradle配置文件
下面是完整的配置,我会逐部分解释:
plugins { // 引入C++库插件,用来构建unit1和unit2组成的库 id 'cpp-library' // 引入C++应用插件,用来构建可执行程序 id 'cpp-application' } // 配置工具链,指定使用clang++-5.0编译 toolChains { clang { // 指向你的clang++-5.0可执行文件路径 executable = file('/usr/bin/clang++-5.0') } } // 配置核心库(unit1和unit2) library { // 指定库的源码目录 source.from fileTree('src/corelib/cpp') // 指定库的头文件目录 headers.from fileTree('src/corelib/headers') // 可选:设置库类型为静态库(默认是共享库),如果需要静态链接的话 // binaries.withType(StaticLibraryBinary) { // baseName = 'corelib' // } } // 创建第一个应用程序组件:app1(对应main1.cpp) components.create('app1', ApplicationSpec) { // 指定app1的源码目录 source.from fileTree('src/app1/cpp') // 依赖我们的核心库 dependencies { implementation library } } // 创建第二个应用程序组件:app2(对应main2.cpp) components.create('app2', ApplicationSpec) { // 指定app2的源码目录 source.from fileTree('src/app2/cpp') // 依赖核心库 dependencies { implementation library } } // 可选:自定义简化的运行任务(如果你想按更直观的方式调用) tasks.register('run', Exec) { description = '运行指定的主程序,用法:gradle run -Papp=app1 或 gradle run -Papp=app2' // 根据传入的app参数决定依赖哪个链接任务 dependsOn { project.hasProperty('app') ? "link${app.capitalize()}" : 'linkApp1' } // 执行对应的可执行文件 commandLine { def appName = project.hasProperty('app') ? app : 'app1' "${buildDir}/exe/${appName}/${appName}" } }
配置说明:
- 插件引入:
cpp-library用来把unit1和unit2打包成可复用的库,避免重复编译;cpp-application用来构建可执行程序。 - 工具链配置:明确指定使用
clang++-5.0,Gradle会自动用这个编译器来处理所有C++代码。 - 核心库配置:告诉Gradle哪里找unit1/unit2的源码和头文件,编译后会生成库文件供两个主程序使用。
- 应用组件配置:分别为main1和main2创建独立的应用组件,每个都依赖核心库,确保编译时能找到unit1/unit2的头文件和链接库。
- 自定义run任务:如果觉得Gradle自动生成的任务名称有点长,可以用这个自定义任务,通过
-Papp参数指定要运行的程序。
第三步:如何构建和运行
方式一:使用Gradle自动生成的任务
- 构建并运行main1:
gradle runApp1 - 构建并运行main2:
gradle runApp2 - 只构建不运行:
gradle buildApp1或gradle buildApp2
方式二:使用自定义的run任务
- 运行main1:
gradle run -Papp=app1 - 运行main2:
gradle run -Papp=app2
验证编译是否用了clang++-5.0
你可以加上--info参数查看编译日志,比如gradle runApp1 --info,里面会显示调用的编译器路径,确认是/usr/bin/clang++-5.0。
内容的提问来源于stack exchange,提问作者Erel Segal-Halevi
相关产品推荐
相关产品推荐

