Cmake命令之add_subdirectory介绍

文章详细介绍了CMake中的`add_subdirectory`命令,该命令用于将子目录添加到构建系统中,其中包含了对源代码目录、输出目录以及`EXCLUDE_FROM_ALL`选项的解释。通过示例展示了如何构建和排除子目录的可执行文件生成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)。

举例:
目录结构如下:
请添加图片描述

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可执行文件。可分别得出以下结果:

请添加图片描述

请添加图片描述

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZUSTAND

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值