目录
1、find_path
2、find_library
3、find_program
find_path 参考文章:CMake中find_path的使用
find_library 参考文章:CMake中find_library的使用
1、find_path
find_path 一般用于在某个目录下查找一个或者多个头文件,命令的执行结果会保存到 <VAR> 中。同时命令的执行结果也会默认缓存到 CMakeCache.txt 中。
(1) 格式
find_path 的格式如下:
find_path (
<VAR>
NAMES name1 [name2 ...]
[HINTS [path | ENV var]... ]
[PATHS [path | ENV var]... ]
[NO_CACHE]
[REQUIRED]
)
选项解析:
- <VAR>:用于保存命令的执行结果
- NAMES:要查找的头文件
- HINTS | PATHS
- HINTS:先搜索指定路径,后搜索系统路径
- PATHS:先搜索系统路径,后搜索
- NO_CACHE:搜索结果将存储在普通变量中而不是缓存条目(即CMakeCache.txt)中
- REQUIRED:如果没有找到指定头文件,就出发错误提示,变量会设为 <VAR>-NOTFOUND
执行结果:
查找成功时,会向变量<VAR>中添加成功找到头文件的目录,如果在某个路径下查找多个头文件,只要查找到多个头文件中的某一个,也算执行成功。
注意:
虽然HINTS / PATHS后面可以跟多条路径,但是每次只会向变量中<VAR>添加一个目录,那就是成功找到头文件的目录。
(2) 举例
在一条指定路径下查找头文件:
unset(INCLUDE_DIR CACHE) # 清除之前的缓存
find_path(INCLUDE_DIR # 在指定路径下查找 gather.h
NAMES gather.h
# 虽然有多条路径,但只会把含当前头文件的目录加入到 INCLUDE_DIR 中
HINTS ${PROJECT_SOURCE_DIR}/vac/util ${PROJECT_SOURCE_DIR}/app1
)
message("${INCLUDE_DIR}")
在多条路径下查找头文件:
unset(INCLUDE_DIR CACHE) # 清除变量 INCLUDE_DIR 之前的缓存
find_path(INCLUDE_DIR
NAMES gather.h
HINTS ${PROJECT_SOURCE_DIR}/vac/util ${PROJECT_SOURCE_DIR}/app1
)
list(APPEND ADD_INCLUDE_DIR ${INCLUDE_DIR}) # 以追加的方式添加到 ADD_INCLUDE_DIR
message("${INCLUDE_DIR}")
unset(INCLUDE_DIR CACHE) # 清除变量 INCLUDE_DIR 之前的缓存
find_path(INCLUDE_DIR
NAMES mul.h
HINTS ${PROJECT_SOURCE_DIR}/vac/util ${PROJECT_SOURCE_DIR}/app1
)
list(APPEND ADD_INCLUDE_DIR ${INCLUDE_DIR}) # 以追加的方式添加到 ADD_INCLUDE_DIR
message("${INCLUDE_DIR}")
message("${ADD_INCLUDE_DIR}")
2、find_library
find_library 一般直接去查找依赖库文件,和find_package 不一样,find_package 找的是 .cmake 文件,而find_library 直接找 .so 或者 .a 文件。
和 find_path 一样,命令的执行结果会默认缓存到 CMakeCache.txt 中。
(1) 格式
相关选项解析可以参考 find_path
find_library (
<LIBRARY_NAME>
NAMES name1 [name2 ...]
[NAMES_PER_DIR]
[HINTS [path | ENV var]... ]
[PATHS [path | ENV var]... ]
[NO_CACHE]
[REQUIRED]
)
选项解析:
- LIBRARY_NAME:库名。允许两种形式,前缀+库名+后缀、只有库名。
- NAMES_PER_DIR:表示一个名称遍历查找一次。而不是在某个路径下,查看是否存在多个库
执行结果:
查找成功时,会向变量<LIBRARY_NAME>中添加成功找到头文件的库文件(包含完整路径),如果在某个路径下查找多个头文件,只要查找到多个头文件中的某一个,也算执行成功。
注意:
虽然HINTS / PATHS后面可以跟多条路径,但是每次只会向变量中<VAR>添加一个目录,那就是成功找到头文件的目录。
(2) 举例
查找一个或者多个路径也可以参考 find_path
unset(LIBS CACHE) # 清空变量LIB_DIR
find_library(LIBS
NAMES libopencv_core.so # 前缀+库名+后缀
HINTS /home/gzx/toolchain/opencv-3.4.10/build/lib
)
message("${LIBS}") # /home/gzx/toolchain/opencv-3.4.10/build/lib/libopencv_core.so
unset(LIBS CACHE) # 清空变量LIB_DIR
find_library(LIBS
NAMES opencv_highgui # 只有库名
HINTS /home/gzx/toolchain/opencv-3.4.10/build/lib
)
message("${LIBS}") # /home/gzx/toolchain/opencv-3.4.10/build/lib/libopencv_highgui.so
3、find_program
find_program 一般用于查找指定名称的可执行文件。相关内容可以参考find_path 或者 find_library
find_program (
<VAR>
name | NAMES name1 [name2 ...]
[NAMES_PER_DIR]
[HINTS [path | ENV var]... ]
[PATHS [path | ENV var]... ]
[NO_CACHE]
[REQUIRED]
)