这个语句的作用是增加编译子目录。其基本语法格式是:
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_PATH
和LIBRARY_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