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