add_subdirectory()
add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL] [SYSTEM])
- 命令解析
- source_dir
必选参数。该参数指定一个子目录,子目录下应该包含CMakeLists.txt文件和代码文件。子目录可以是相对路径也可以是绝对路径,如果是相对路径,则是相对当前目录的一个相对路径。 - binary_dir
可选参数。该参数指定一个目录,用于存放输出文件。可以是相对路径也可以是绝对路径,如果是相对路径,则是相对当前输出目录的一个相对路径。如果该参数没有指定,则默认的输出目录使用source_dir。 - EXCLUDE_FROM_ALL
可选参数。当指定了该参数,则子目录下的目标不会被父目录下的目标文件包含进去,父目录的CMakeLists.txt不会构建子目录的目标文件,必须在子目录下显式去构建。例外情况:当父目录的目标依赖于子目录的目标,则子目录的目标仍然会被构建出来以满足依赖关系(例如使用了target_link_libraries)。
- source_dir
举例:
目录结构如下:
CMAKE_02/CMakeLists.txt
内容:
- add_subdirectory(CASE1)
- add_subdirectory(CASE2 output EXCLUDE_FROM_ALL)
1.执行CASE1目录下的CMakeLists.txt
2.执行CASE2目录下的CMakeLists.txt 二进制文件保存于output文件夹中,EXCLUDE_FROM_ALL不生成可执行文
cmake_minimum_required(VERSION 3.2)
project(cmake_02)
add_subdirectory(CASE1)
add_subdirectory(CASE2 output EXCLUDE_FROM_ALL)
message("CASE1 and CASE2 finished")
./CMAKE_02/CASE1/CMakeLists.txt
内容:
内容解释:
- cmake最小版本 3.2
- 项目名称 CASE2
- 指定头文件路径 ./include
- 指定生成可执行目标文件名 case2
- 指定目标生成所依赖的代码文件 ./src/main.cpp
cmake_minimum_required(VERSION 3.2)
message("CASE2 RUNING")
project(CASE2)
include_directories(./include)
add_executable(case2)
target_sources(case2 PRIVATE ./src/main.cpp)
#target_include_directories(case1 PRIVATE ./include)
./CMAKE_02/CASE2/CMakeLists.txt
内容解释:
- cmake最小版本 3.2
- 项目名称 CASE1
- 指定头文件路径 ./include
- 指定生成可执行目标文件名 case1
- 指定目标生成所依赖的代码文件 ./src/main.cpp
cmake_minimum_required(VERSION 3.2)
message("CASE1 RUNING")
project(CASE1)
add_executable(case1)
target_sources(case1 PRIVATE ./src/main.cpp)
target_include_directories(case1 PRIVATE ./include)
case1的代码:
./include/case1.h
int add(int a,int b){
return a+b;
}
./src/main.cpp
#include <iostream>
#include "case1.h"
using namespace std;
int main(){
cout<<"hello case1"<<endl;
cout<<"sum : "<<add(10,5)<<endl;
return 0;
}
case2的代码:
./include/case2.h
int sub(int a,int b ){
return a-b;
}
./src/main.cpp
#include <iostream>
#include "case2.h"
using namespace std;
int main(){
cout<<"hello case2!"<<endl;
cout<<"sub:"<<sub(10,5)<<endl;
return 0;
}
测试EXCLUDE_FROM_ALL
的作用,如果有它,则将不会生成对应的可执行文件,删掉它才能执行。这个对应此案例中的case2。这里我将其删掉。
CMAKE_02/CMakeLists.txt
中的EXCLUDE_FROM_ALL
删掉:
add_subdirectory(CASE2 output EXCLUDE_FROM_ALL)
改成如下形式:
add_subdirectory(CASE2 output )
命令行输入以下命令:
cmake -S . -B build
cmake --build build
可以在build文件看找到case1文件夹和output文件夹(由此句add_subdirectory(CASE2 output)
指定)。进入case1和output分别运行case1,case2可执行文件。可分别得出以下结果: