CMake从入门到精通(二十二)通过add_subdirectory创建多个工程
目录结构:
d:\work\cmake_test\testmultiprj\CMakeLists.txt:
d:\work\cmake_test\testmultiprj\prj1\CMakeLists.txt:
d:\work\cmake_test\testmultiprj\prj2\CMakeLists.txt:
界面运行:
打开sln:
有:
可以看到,prj_sln被vs2019称之为解决方案,也就是根目录下的那个工程
prj1,和prj2分别是给定的工程名。也是目录名称。
project1和project2是构建目录下(即build目录下)的工程文件夹名称。
生成有:
可以看到解决方案下的每个工程都进行了构建,并生成了执行文件(也可能是库文件)。
本文中为prj1.exe和prj2.exe。
下面进一步区分一些细节:
目录结构如下:
testmultiprj为根目录,代码分别放在prj1_code_dir和prj2_code_dir两个目录下,两个目录都有自己的CMakeLists.txt文件。
具体如下:
每个文件具体内容为:
d:\work\cmake_test\testmultiprj\prj1_code_dir\CMakeLists.txt:
d:\work\cmake_test\testmultiprj\prj2_code_dir\CMakeLists.txt:
d:\work\cmake_test\testmultiprj\CMakeLists.txt:
运行结果如下:
cmake在build目录构建出prj_sln.sln解决方案,解决方案下有两个工程(project),其工程目录为prj1_name_in_build和prj2_name_in_build,每个工程目录自成体系,存放属于自己的工程文件。
具体如下:
其中prj1_ProjectName.sln是CMakeLists.txt中指定的工程名字。
同理:
每个工程文件可以单独打开编译:
已启动重新生成…
1>------ 已启动全部重新生成: 项目: ZERO_CHECK, 配置: Debug x64 ------
1>Checking Build System
2>------ 已启动全部重新生成: 项目: prj1_ProjectName, 配置: Debug x64 ------
2>Building Custom Rule D:/work/cmake_test/testmultiprj/prj1_code_dir/CMakeLists.txt
2>main.cpp
2>prj1_ProjectName.vcxproj -> D:\work\cmake_test\testmultiprj\build\prj1_name_in_build\Debug\prj1_ProjectName.exe
3>------ 已跳过全部重新生成: 项目: ALL_BUILD, 配置: Debug x64 ------
3>没有为此解决方案配置选中要生成的项目
========== 全部重新生成: 成功 2 个,失败 0 个,跳过 1 个 ==========
运行:
hello prj1!
D:\work\cmake_test\testmultiprj\build\prj1_name_in_build\Debug\prj1_ProjectName.exe (进程 13844)已退出,代码为 0。
按任意键关闭此窗口. . .
也可以在通过解决方案打开,集中管理:
编译:
已启动重新生成…
1>------ 已启动全部重新生成: 项目: ZERO_CHECK, 配置: Debug x64 ------
1>Checking Build System
2>------ 已启动全部重新生成: 项目: prj1_ProjectName, 配置: Debug x64 ------
3>------ 已启动全部重新生成: 项目: prj2_ProjectName, 配置: Debug x64 ------
2>Building Custom Rule D:/work/cmake_test/testmultiprj/prj1_code_dir/CMakeLists.txt
2>main.cpp
3>Building Custom Rule D:/work/cmake_test/testmultiprj/prj2_code_dir/CMakeLists.txt