- CMAKE環(huán)境變量
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
交叉編譯常用,內(nèi)含編譯工具鏈的一些配置
1)CMAKE_FIND_ROOT_PATH
目錄list,交叉編譯常用,主要是找到文件系統(tǒng)的根目錄,在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的所在路徑的源代碼完整路徑,動態(tài)
與CMAKE_CURRENT_LIST_DIR的區(qū)別:
待更新,一般使用的CMAKE_CURRENT_LIST_DIR
5)CMAKE_CURRENT_BINARY_DIR
當前處理的CMakeLists.txt的binary的路徑,在add_subdirectory()的時候會在build tree中創(chuàng)建一個binarary的路徑,一般在build目錄下
6)CMAKE_SOURCE_DIR
最頂層的CMakeLists.txt所在目錄的源代碼的完整路徑,靜態(tài)
7)CMAKE_BINARY_DIR
最頂層的編譯輸出的目錄。
8)CMAKE_MODULE_PATH
目錄list,針對Find<PackageName>.cmake 路徑進行的find_package()搜索,需要指定到.cmake所在目錄,而不是prefix。
9)CMAKE_SYSROOT
等同于--sysroot,一般設置在CMAKE_TOOLCHAIN_FILE指定的文件中,使用REALPATH,否則會出現(xiàn)一些異常(軟鏈接等)。交叉編譯的時候使用較多,所有路徑(包括其他變量)會基于此路徑解析,但他本身不參與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()中起作用。設置參數(shù)意義同CMAKE_FIND_ROOT_PATH_MODE_INCLUDE
12)CMAKE_FIND_ROOT_PATH_MODE_LIBRARY
該變量只有當CMAKE_FIND_ROOT_PATH和CMAKE_SYSROOT被使用的時候,才會在find_library()中起作用。設置參數(shù)意義同CMAKE_FIND_ROOT_PATH_MODE_INCLUDE
13)CMAKE_FIND_ROOT_PATH_MODE_PACKAGE
該變量只有當CMAKE_FIND_ROOT_PATH和CMAKE_SYSROOT被使用的時候,才會在find_package()中起作用。設置參數(shù)意義同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()搜索過程中,路徑的優(yōu)先級,由高到低如下(以下應該是非交叉編譯的情況):
*顯式的通過PATHS或HINTS指定路徑,優(yōu)先級最高
*CMAKE_MODULE_PATH,僅限Module模式
*CMAKE_PREFIX_PATH,僅限Config模式,基于CMAKE_PREFIX_PATH構造的路徑<prefix>/lib/cmake/<Package>會優(yōu)先搜索
CMAKE_FIND_ROOT_PATH,所有的find_命令的搜索路徑會基于該根目錄展開,比如,若CMAKE_FIND_ROOT_PATH=/opt/cross,則實際搜索路徑可能為/opt/cross/usr/lib等等
*系統(tǒng)默認路徑,/usr/local,/usr等系統(tǒng)目錄,以及環(huán)境變量PATH中定義的可執(zhí)行文件程序的路徑。
交叉編譯的時候,不同,但是遵循以下規(guī)則,一般交叉編譯會設置CMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ONLY。
| 配置模式 | 優(yōu)先級順序 | 使用場景 |
|---|---|---|
| CMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ONLY | CMAKE_FIND_ROOT_PATH 獨占優(yōu)先級 | 嚴格隔離宿主機和目標機路徑的場景 |
| CMAKE_FIND_ROOT_PATH_MODE_PACKAGE=BOTH | CMAKE_PREFIX_PATH 優(yōu)先 | 混合搜索宿主機和目標機路徑的調(diào)試場景 |
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}) # 庫目錄