目录

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}")

python中调用cmake模块 cmake find_path_c++

在多条路径下查找头文件:

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}")

python中调用cmake模块 cmake find_path_python中调用cmake模块_02

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

python中调用cmake模块 cmake find_path_头文件_03

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]
)