(十一)CMake的ADD_SUBDIRECTORY

一、ADD_SUBDIRECTORY

这个语句的作用是增加编译子目录。其基本语法格式是:

ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

一共有三个参数,后两个是可选参数

  • source_dir 源代码目录

指定一个包含CMakeLists.txt和代码文件所在的目录,该目录可以是绝对路径,也可以是相对路径,对于后者相对路径的起点是CMAKE_CURRENT_SOURCE_DIR。此外,如果子目录再次包含的CMakeLists.txt,则将继续处理里层的CMakeLists.txt,而不是继续处理当前源代码。

  • binary_dir 二进制代码目录(其实就是cmake命令输出文件)

这个目录是可选的,如果指定,cmake命令执行后的输出文件将会存放在此处,若没有指定,默认情况等于source_dir没有进行相对路径计算前的路径,也就是CMAKE_BINARY_DIR

对于一个没有子文件夹的工程输出的文件夹和文件如下:

.
├── CMakeCache.txt
├── CMakeFiles
├── cmake_install.cmake
└── Makefile

1 directory, 3 files

CMakeCache.txt 、CMakeFiles文件夹、cmake_install.cmake安装相关配置、和一个Makefile。这个Makefile就是我们进行make的文件。

对于一个有子文件的工程输出的文件夹和文件结构如下:

.
├── CMakeCache.txt
├── CMakeFiles
│   ├── 3.16.3
│   ├── cmake.check_cache
│   ├── CMakeDirectoryInformation.cmake
│   ├── CMakeOutput.log
│   ├── CMakeTmp
│   ├── Makefile2
│   ├── Makefile.cmake
│   ├── progress.marks
│   └── TargetDirectories.txt
├── cmake_install.cmake
├── Exe1
│   ├── CMakeFiles
│   ├── cmake_install.cmake
│   ├── Demo1
│   ├── Exe11
│   └── Makefile
├── Exe2
│   ├── CMakeFiles
│   ├── cmake_install.cmake
│   └── Makefile
└── Makefile

8 directories, 15 files

Exe1和Exe2是我增加的子文件夹,产生的中间文件多了两个Exe1和Exe2同名文件夹,其基本结构和单个文件夹一样。

  • EXCLUDE_FROM_ALL标记

这个标志是可选的,如果传递了该参数表示新增加的子目录将会排除在ALL目录之外(可能是make系统中的make all?),表示这个目录将从IDE的工程中排除。用户必须显式在子文件这个编译目标(手动cmake之类的)。指定了这个文件夹,表示这个文件夹是独立于源工程的,这些函数是有用但是不是必要的,比如说我们一系列的例子。

这个命令用于添加源文件子目录,同时还可以指定中间二进制和目标二进制的生成路径。EXCLUDE_FROM_ALL将会将这个目录从编译中排除,如工程的例子需要等待其他编译完成后再进行单独的编译。通常子目录应该包含自己的project()命令,这样以来整个编译命令将会产生各自的目标文件。如果把CMakeLists.txt与VS IDE比较,总的CMakeLists.txt就相当于解决方案,子CMakeLists.txt就相当于在解决方案下的工程文件。还有一个需要注意的是,如果编译父CMakeLists时依赖了子CMakeLists.txt中的源文件,那么该标志将会被覆盖(也就是也会处理),以满足编译任务。

二、改变最终目标文件输出位置

什么是最终文件?答:库文件或者可执行文件,默认情况将会输出到与输出目录同级的文件夹中。经过cmake命令执行后的文件并没有实际进行gcc的编译,需要手动到Makefile处进行编译,那么如何修改CMakeLists.txt让这个Makefile输出目标文件到我们指定的地方?很简单,设置EXECUTABLE_OUTPUT_PATHLIBRARY_OUTPUT_PATH

如,我们想把make最终生成目标库输出至lib中,在CMakeLists.txt增加以下语句:

SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)

当然如果是输出可执行到另一个地方,那么增加以下语句:

SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

[1] https://www.cnblogs.com/52php/p/5681751.html
[2] https://cmake.org/cmake/help/latest/command/add_subdirectory.html

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值