CMake多个CMakeLists.txt共同合作编译一个C++项目
一、概述
在C++项目比较大或者要根据不同的规则生成不同的执行文件或者动态库/静态库的时候。单独的CMakeLists.txt会变的比较复杂,此时可以利用CMakeLists.txt的父子关系分目录分模块的进行编译及输出。
就相当于项目模块化编译
二、具体实现
1.demo目录
目录说明:
bin目录代表可执行文件输出目录
build目录是cmake编译目录
lib目录是静态/动态库输出目录
include目录是头文件输出目录
student、teacher、student_test、teacher_test目录是子目录,每个子目录下都有一个CMakeLists.txt文件。其中student、和teacher目录用于生成静态库/动态库,即.a/.so文件,静态/动态库存放到 lib目录中。
student_test和teacher_test目录用于生成可执行文件,可执行文件存入bin目录中
根目录下的CMakeLists.txt是父文件
run.sh是执行脚本,编译的时候直接运行./run.sh就可以了。
1.根目录CMakeLists.txt的内容如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #参考样例(Cmake保姆级教程):https://subingwen.cn/cmake/CMake-primer/ cmake_minimum_required(VERSION 3.0.0) #设置C++的编译版本,其中CMAKE_CXX_STANDARD是固定的,11代表C++11 set(CMAKE_CXX_STANDARD 11) #设置项目名称 project(school VERSION 0.1.0) # 定义变量 # 静态库生成的路径 set(LIB_PATH ${CMAKE_CURRENT_SOURCE_DIR}/lib) # 测试程序生成的路径 set(EXEC_PATH ${CMAKE_CURRENT_SOURCE_DIR}/bin) # 头文件目录 set(HEAD_PATH ${CMAKE_CURRENT_SOURCE_DIR}/include) # 静态库的名字(静态库项目名称),他们两者公用一个,其实他们一毛钱关系都没有,可以单独设置,这里为了方便设置成一样 set(STUDENT_LIB student) set(TEACHER_LIB teacher) # 可执行程序的名字(可执行文件的项目名),他们两者公用一个,其实他们一毛钱关系都没有,可以单独设置,这里为了方便设置成一样 set(STUDENT_TEST student_test) set(TEACHER_TEST teacher_test) # 添加子目录,参数是项目名称 add_subdirectory(${STUDENT_LIB}) add_subdirectory(${TEACHER_LIB}) add_subdirectory(${STUDENT_TEST}) add_subdirectory(${TEACHER_TEST}) |
2.student目录下的CMakeLists.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #参考样例(Cmake保姆级教程):https://subingwen.cn/cmake/CMake-primer/ cmake_minimum_required(VERSION 3.0.0) #设置C++的编译版本,其中CMAKE_CXX_STANDARD是固定的,11代表C++11 set(CMAKE_CXX_STANDARD 11) #设置项目名称(父CMakeLists.txt中设置过的) project(${STUDENT_LIB} VERSION 0.1.0) #搜索当前目录下的所有源文件 aux_source_directory(./ SRC) #导入头文件 include_directories(${HEAD_PATH}) #设置生成库的路径,输出路径是根节点定义的 set(LIBRARY_OUTPUT_PATH ${LIB_PATH}) #生成静态库,静态库的名字是根节点定义的 add_library(${STUDENT_LIB} STATIC ${SRC}) |
3.teacher目录下的CMakeLists.txt
#参考样例(Cmake保姆级教程):https://subingwen.cn/cmake/CMake-primer/ cmake_minimum_required(VERSION 3.0.0) #设置C++的编译版本,其中CMAKE_CXX_STANDARD是固定的,11代表C++11 set(CMAKE_CXX_STANDARD 11) #设置项目名称 project(${TEACHER_LIB} VERSION 0.1.0) #搜索当前目录下的所有源文件 aux_source_directory(./ SRC) #导入头文件 include_directories(${HEAD_PATH}) #设置生成库的路径,输出路径是根节点定义的 set(LIBRARY_OUTPUT_PATH ${LIB_PATH}) #生成静态库,静态库的名字是根节点定义的 add_library(${TEACHER_LIB} STATIC ${SRC})
4.student_test目录下的CMakeLists.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #参考样例(Cmake保姆级教程):https://subingwen.cn/cmake/CMake-primer/ cmake_minimum_required(VERSION 3.0.0) #设置C++的编译版本,其中CMAKE_CXX_STANDARD是固定的,11代表C++11 set(CMAKE_CXX_STANDARD 11) #设置项目名称 project(${STUDENT_TEST} VERSION 0.1.0) #搜索当前目录下的所有源文件 aux_source_directory(./ SRC) #导入头文件 include_directories(${HEAD_PATH}) #指定库文件路径 link_directories(${LIB_PATH}) #指定可执行程序要链接的静态库 link_libraries(${STUDENT_LIB}) #设置可执行程序的生成路径 set(EXECUTABLE_OUTPUT_PATH ${EXEC_PATH}) #生成可执行程序 add_executable(${STUDENT_TEST} ${SRC}) |
5.teacher_test目录下的CMakeLists.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #参考样例(Cmake保姆级教程):https://subingwen.cn/cmake/CMake-primer/ cmake_minimum_required(VERSION 3.0.0) #设置C++的编译版本,其中CMAKE_CXX_STANDARD是固定的,11代表C++11 set(CMAKE_CXX_STANDARD 11) #设置项目名称 project(${TEACHER_TEST} VERSION 0.1.0) #搜索当前目录下的所有源文件 aux_source_directory(./ SRC) #导入头文件 include_directories(${HEAD_PATH}) #指定库文件路径 link_directories(${LIB_PATH}) #指定可执行程序要链接的静态库 link_libraries(${TEACHER_LIB}) #设置可执行程序的生成路径 set(EXECUTABLE_OUTPUT_PATH ${EXEC_PATH}) #生成可执行程序 add_executable(${TEACHER_TEST} ${SRC}) |
6.run.sh脚本代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #!/usr/bin/env bash #自动化运行的脚本 BUILD_DIR= 'build' #删除build目录 rm -rf $BUILD_DIR #重新编译 -B build代表编译文件存放目录 cmake -B build -G "MinGW Makefiles" echo $BUILD_DIR #进入build目录 cd $BUILD_DIR #执行make编译 mingw32-make #运行可执行文件 ../bin/student_test.exe ../bin/teacher_test.exe |
总结:每行代码的意思注释都很详细了。要看再详细一点的可以看【大丙】的博客,我也是参考那个写的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库