- CMAKE环境变量
1)CMAKE_PREFIX_PATH
目录list,指定安装的目录前缀,可以被find_package(), find_program(), find_library(), find_file(), and find_path()使用。
This variable may hold a single prefix or a list of prefixes separated by : on UNIX or ; on Windows (the same as the PATH environment variable convention on those platforms).
2)CMAKE_INSTALL_PREFIX
install的目录前缀,会被添加CMAKE_SYSTEM_PREFIX_PATH,所以也可以被find_package(), find_program(), find_library(), find_path(), and find_file()搜索到。
3)CMAKE_INCLUDE_PATH
目录list,会被find_file(), find_path()搜索到。
4)CMAKE_LIBRARY_PATH
目录list,会被find_library()搜索到。
5)CMAKE_PROGRAM_PATH
目录list,会被find_program()搜索到
6)CMAKE_IGNORE_PATH
目录list,会被find_program(),find_library(),find_file, find_path搜索的时候忽略掉。
7)CMAKE_IGNORE_PREFIX_PATH
比CMAKE_IGNORE_PATH更好一点的方式,采用前缀方式,也许会用在大工程里面的某个小component去忽略掉部分路径。
8)CMAKE_TOOLCHAIN_FILE
交叉编译常用,内含编译工具链的一些配置
1)CMAKE_FIND_ROOT_PATH
目录list,交叉编译常用,主要是找到文件系统的根目录,在find_package(),find_library()等中起作用。
2)CMAKE_CURRENT_LIST_DIR
当前处理的CMakeLists.txt或者.cmake的目录
3)CMAKE_CURRENT_LIST_FILE
当前处理的CMakeLists.txt的完整路径
4)CMAKE_CURRENT_SOURCE_DIR
当前处理的CMakeLists.txt的所在路径的源代码完整路径,动态
与CMAKE_CURRENT_LIST_DIR的区别:
待更新,一般使用的CMAKE_CURRENT_LIST_DIR
5)CMAKE_CURRENT_BINARY_DIR
当前处理的CMakeLists.txt的binary的路径,在add_subdirectory()的时候会在build tree中创建一个binarary的路径,一般在build目录下
6)CMAKE_SOURCE_DIR
最顶层的CMakeLists.txt所在目录的源代码的完整路径,静态
7)CMAKE_BINARY_DIR
最顶层的编译输出的目录。
8)CMAKE_MODULE_PATH
目录list,针对Find<PackageName>.cmake 路径进行的find_package()搜索,需要指定到.cmake所在目录,而不是prefix。
9)CMAKE_SYSROOT
等同于--sysroot,一般设置在CMAKE_TOOLCHAIN_FILE指定的文件中,使用REALPATH,否则会出现一些异常(软链接等)。交叉编译的时候使用较多,所有路径(包括其他变量)会基于此路径解析,但他本身不参与find_package()的搜索逻辑,而是作为全局根路径影响其他路径的最终解析。
10)CMAKE_FIND_ROOT_PATH_MODE_INCLUDE
该变量只有当CMAKE_FIND_ROOT_PATH和CMAKE_SYSROOT被使用的时候,才会在find_file()和find_path()中起作用。如果设置为ONLY,只有CMAKE_FIND_ROOT_PATH会被搜索,如果设置为NEVER,CMAKE_FIND_ROOT_PATH会被忽略掉,而去搜索host system root。如果设置为BOTH,则两个都会被搜索。
11)CMAKE_FIND_ROOT_PATH_MODE_PROGRAM
该变量只有当CMAKE_FIND_ROOT_PATH和CMAKE_SYSROOT被使用的时候,才会在find_program()中起作用。设置参数意义同CMAKE_FIND_ROOT_PATH_MODE_INCLUDE
12)CMAKE_FIND_ROOT_PATH_MODE_LIBRARY
该变量只有当CMAKE_FIND_ROOT_PATH和CMAKE_SYSROOT被使用的时候,才会在find_library()中起作用。设置参数意义同CMAKE_FIND_ROOT_PATH_MODE_INCLUDE
13)CMAKE_FIND_ROOT_PATH_MODE_PACKAGE
该变量只有当CMAKE_FIND_ROOT_PATH和CMAKE_SYSROOT被使用的时候,才会在find_package()中起作用。设置参数意义同CMAKE_FIND_ROOT_PATH_MODE_INCLUDE
14)CMAKE_FIND_ROOT_PATH_MODE_PACKAGE
该变量表示是否使用CMAKE_FIND_ROOT_PATH和CMAKE_SYSROOT在find_package()中使用。ONLY表示只会搜索CMAKE_FIND_ROOT_PATH,NEVER则会忽略掉CMAKE_FIND_ROOT_PATH,使用host system的root。BOTH则都会使用。
15)find_package()搜索过程中,路径的优先级,由高到低如下(以下应该是非交叉编译的情况):
*显式的通过PATHS或HINTS指定路径,优先级最高
*CMAKE_MODULE_PATH,仅限Module模式
*CMAKE_PREFIX_PATH,仅限Config模式,基于CMAKE_PREFIX_PATH构造的路径<prefix>/lib/cmake/<Package>会优先搜索
CMAKE_FIND_ROOT_PATH,所有的find_命令的搜索路径会基于该根目录展开,比如,若CMAKE_FIND_ROOT_PATH=/opt/cross,则实际搜索路径可能为/opt/cross/usr/lib等等
*系统默认路径,/usr/local,/usr等系统目录,以及环境变量PATH中定义的可执行文件程序的路径。
交叉编译的时候,不同,但是遵循以下规则,一般交叉编译会设置CMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ONLY。
| 配置模式 | 优先级顺序 | 使用场景 |
|---|---|---|
| CMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ONLY | CMAKE_FIND_ROOT_PATH 独占优先级 | 严格隔离宿主机和目标机路径的场景 |
| CMAKE_FIND_ROOT_PATH_MODE_PACKAGE=BOTH | CMAKE_PREFIX_PATH 优先 | 混合搜索宿主机和目标机路径的调试场景 |
16)find_package()找到之后,通过下列变量查看信息
| 变量 | 描述 |
|---|---|
| <PackageName>_FOUND | 标识包是否被成功找到,类型为布尔值(TRUE/FALSE) |
| <PackageName>_INCLUDE_DIRS 或 <PackageName>_INCLUDES | 包含头文件的路径列表,用于include_directories() |
| <PackageName>_LIBRARIES 或 <PackageName>_LIBS | 库文件(.a/.so/.lib等)的完整路径列表,用于target_link_libraries() |
| <PackageName>_LIBRARY_DIRS | 库文件所在的目录路径,适用于需要手动指定链接目录的场景 |
| <PackageName>_VERSION 或 <PackageName>_VERSION_STRING | 包的具体版本号 |
下面是一个opencv的例子
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS}) # 头文件路径
target_link_libraries(MyTarget ${OpenCV_LIBS}) # 链接库文件
以及boost的一个例子
find_package(Boost 1.73.0 REQUIRED)
target_include_directories(MyTarget PUBLIC ${Boost_INCLUDE_DIRS}) # 头文件路径
target_link_directories(MyTarget PUBLIC ${Boost_LIBRARY_DIRS}) # 库目录