add_subdirectory
向构建添加一个子目录。
add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
向构建添加子目录。
source_dir指定源CMakeLists.txt和代码文件所在的目录。如果它是一个相对路径,它将相对于当前目录进行计算(典型用法),但它也可能是一个绝对路径。
binary_dir指定放置输出文件的目录。如果它是一个相对路径,它将相对于当前输出目录进行计算,但它也可能是一个绝对路径。如果没有指定binary_dir,在展开任何相对路径之前,将使用source_dir的值(典型用法)。
如果指定了EXCLUDE_FROM_ALL参数,那么默认情况下子目录中的目标将不包含在父目录的ALL目标中,并且将从IDE项目文件中排除。用户必须显示地在子目录中构建目标。这意味着当子目录包含有用但不是必须的项目的单独部分时使用,例如一组实例。通常,子目录应该包含自己的project()命令调用,以便在子目录中生成完成的构建系统(例如VS IDE解决方案文件)。注意,目标间的依赖关系取代了这种排除。如果父项目构建的目标依赖于子目录中的目标,则依赖的目标将包含在父项目构建系统中以满足依赖性。
例子
示例一
内容
.
├── CMakeLists.txt
├── main.cc
└── math
├── CMakeLists.txt
├── MathFunction.cc
└── MathFunction.h
$ cat CMakeLists.txt
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (Demo3)
# 查找目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
# 添加 math 子目录
add_subdirectory(math)
# 指定生成目标
add_executable(Demo ${DIR_SRCS})
# 添加链接库
target_link_libraries(Demo MathFunctions)
$ cat main.cc
#include <stdio.h>
#include <stdlib.h>
#include "math/MathFunction.h"
int main(int argc, char *argv[])
{
if (argc < 3){
printf("Usage: %s base exponent \n", argv[0]);
return 1;
}
double base = atof(argv[1]);
int exponent = atoi(argv[2]);
double result = power(base, exponent);
printf("%g ^ %d is %g\n", base, exponent, result);
return 0;
}
$ cat math/CMakeLists.txt
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_LIB_SRCS 变量
aux_source_directory(. DIR_LIB_SRCS)
# 指定生成 MathFunctions 链接库
add_library (MathFunctions ${DIR_LIB_SRCS})
$ cat math/MathFunction.cc
double power(double base, int exponent)
{
int result = base;
int i;
if (exponent == 0) {
return 1;
}
for(i = 1; i < exponent; ++i){
result = result * base;
}
return result;
}
$ cat math/MathFunction.h
#ifndef POWER_H
#define POWER_H
extern double power(double base, int exponent);
#endif
运行
$ mkdir build && cd build
$ cmake .. && make
$ ./Demo 4 5
4 ^ 5 is 1024