文章目录
- 第二章 CMake基础语法
- 2.16 CMake查找文件find_file()命令
- 2.16.1 测试find_file搜索结果设置缓存变量
- 2.16.2 给find_file指定目录
- 2.16.3 给find_file指定路径和额外路径
- 2.17 CMake查找程序find_program()与查找库find_library()
- 2.17.1 find_program()
- 2.17.2 find_library()
本文介绍CMake查找文件find_file()命令、查找程序find_program()与查找库find_library()。
第二章 CMake基础语法
2.16 CMake查找文件find_file()命令
CMake查找文件find_file()命令,默认从CMAKE_INCLUDE_PATH 路径中查找。
作用:使用find_file() 命令用于查找指定文件的完整路径。
语法格式:
find_file(<VAR>name1[path1 path2])<VAR>如果找到文件会将完整路径设置到VAR,否则为<VAR>-NOTFOUND NO_CACHE 若指定,结果则为普通变量,否则结果变量将被创建为缓存变量;REQUIRED 若没有找到任何内容,则停止处理并显示错误消息 NO_DEFAULT_PATH 若指定,表示不会去搜索额外的目录 NO_CMAKE_PATH:若指定,表示不会去搜索普通变量 CMAKE_PREFIX_PATH,CMAKE_INCLUDE_PATH,CMAKE_FRAMEWORK_PATH NO_CMAKE_ENVIRONMENT_PATH:若指定,表示不会去搜索环境变量 CMAKE_PREFIX_PATH,CMAKE_INCLUDE_PATH、CMAKE_FRAMEWORK_PATH2.16.1 测试find_file搜索结果设置缓存变量
可以发现,find_file查找结果默认在缓存变量中;如果指定NO_CACHE之后,就不会设置为缓存变量了。
cmake_minimum_required(VERSION3.23)# 项目名字project(testFindFile)# 设置 find_file文件搜索路径:# CMAKE_SOURCE_DIR 顶层CMakeLists.txt 文件所在的目录.set(CMAKE_INCLUDE_PATH${CMAKE_SOURCE_DIR}/a)message("CMAKE_INCLUDE_PATH =${CMAKE_INCLUDE_PATH}")# CMAKE_INCLUDE_PATH = E:/cmakeLearning/chap2/11findfile/a# find_file 查找结果放在缓存变量中find_file(v1"a.h")message(普通变量 v1=${v1})# 普通变量v1=E:/cmakeLearning/chap2/11findfile/a/a.hmessage(缓存变量 v1=$CACHE{v1})# 缓存变量v1=E:/cmakeLearning/chap2/11findfile/a/a.hmessage("")# 查找没有的文件名find_file(v2"a.exe"NO_CACHE)message(普通变量 v2=${v2})# 普通变量v2=v2-NOTFOUNDmessage(缓存变量 V2=$CACHE{v2})# 缓存变量V2=2.16.2 给find_file指定目录
find_file() 第三个参数指定搜索路径,下面分别演示了指定路径中文件存在和不存在的情况。
cmake_minimum_required(VERSION3.23)#查找文件 如果文件存在find_file(v1"a.h"${CMAKE_SOURCE_DIR}/a)message(普通变量 v1=${v1})# 指定文件所有路径find_file(v2"a.exe"${CMAKE_SOURCE_DIR}/a)message(普通变量 v2=${v2})# 查找文件find_file(v3"my.h")message(v3=${v3})#[[普通变量v1=E:/practice_Code/cmake/21findfile/a/a.h 普通变量v2=E:/practice_Code/cmake/21findfile/a/a.exev3=v3-NOTFOUND]]2.16.3 给find_file指定路径和额外路径
CMAKE_INCLUDE_PATH普通变量给find_file指定目录,缓存CMAKE_INCLUDE_PATH给find_file 指定额外搜索目录。
#最低要求版本cmake_minimum_required(VERSION3.29)# 项目名字project(testFindFile)# 普通变量,搜索目录列表#set(CMAKE_INCLUDE_PATH ${CMAKE_SOURCE_DIR}/a)# 指定环境变量额外目录set(ENV{CMAKE_INCLUDE_PATH}${CMAKE_SOURCE_DIR}/a)message(普通变量CMAKE_INCLUDE_PATH="${CMAKE_INCLUDE_PATH}")# 普通变量CMAKE_INCLUDE_PATH=message(环境变量CMAKE_INCLUDE_PATH=$ENV{CMAKE_INCLUDE_PATH})# 环境变量CMAKE_INCLUDE_PATH=E:/cmakeLearning/chap2/11findfile/a#查找文件find_file(v1"a.h")message(v1=${v1})# v1=E:/cmakeLearning/chap2/11findfile/a/a.h2.17 CMake查找程序find_program()与查找库find_library()
2.17.1 find_program()
使用find_program()命令用于查找指定程序的完整路径。如果设置了CMAKE_LIBRARY_PATH,会去该目录下寻找,语法格式如下:
find_program(<VAR>NAMES<name1>[<name2>...][HINTS<dir1>[<dir2>...]][PATHS<dir1>[<dir2>...]][PATH_SUFFIXES<suffix1>[<suffix2>...]][DOC<string>][REQUIRED][NO_DEFAULT_PATH][NO_CACHE])<VAR>输出变量名,如果找到文件会将完整路径设置到VAR,否则为<VAR>-NOTFOUND NAMES:要找的程序名列表(Windows 可写git或 git.exe,CMake 会自动补全常见后缀) HINTS:提示路径(优先级高于 PATHS;适合你“猜测”安装位置) PATHS:指定额外搜索路径(优先级略低于 HINTS) PATH_SUFFIXES:在每个目录下再追加子目录(如 bin、Scripts) REQUIRED:找不到就直接报错终止配置 NO_DEFAULT_PATH:只在 HINTS/PATHS 中找,不搜系统PATH、注册表、默认目录等 NO_CACHE:不把结果写入缓存(一般不常用;默认会缓存到 CMakeCache.txt 里)使用find_program 在环境变量和普通变量下寻找文件。
# 设置最低版本cmake_minimum_required(VERSION3.23)# 项目名字project(testFindFile)# 不指定目录,默认从当前路径下查找find_program(v2"a.exe")message(v2=${v2})#v2=v2-NOTFOUND# 查找 git,可写多个候选名find_program(GIT_EXE NAMESgitgit.exe DOC"Path to the git executable")message(STATUS"GIT_EXE =${GIT_EXE}")# -- GIT_EXE = GIT_EXE-NOTFOUNDadd_executable(testFindFile main.cpp)find_program(Test_EXE NAMES testFindFile testFindFile.exe DOC"Path to the git executable")message(STATUS"Test_EXE =${Test_EXE}")2.17.2 find_library()
使用find_library()命令用于查找指定的库的完整路径。语法格式类似find_program(),如下:
find_library(<VAR>NAMES<name1>[<name2>...][HINTS<dir1>[<dir2>...]][PATHS<dir1>[<dir2>...]][PATH_SUFFIXES<suffix1>[<suffix2>...]][DOC<string>][REQUIRED][NO_DEFAULT_PATH][NO_CACHE])库:Windows 常见 .lib,MinGW 常见 .a,Linux 常见 .so/.a,
如果找到,VAR保存完整路径;如果找不到,=-NOTFOUND
测试find_library()
# 设置最低版本cmake_minimum_required(VERSION3.23)# 项目名字project(testFindFile)# 不指定目录,默认从当前路径下查找find_program(v2"a.exe")message(v2=${v2})#v2=v2-NOTFOUND# 查找 git,可写多个候选名find_program(GIT_EXE NAMESgitgit.exe DOC"Path to the git executable")message(STATUS"GIT_EXE =${GIT_EXE}")# -- GIT_EXE = GIT_EXE-NOTFOUNDadd_executable(testFindFile main.cpp)find_program(Test_EXE NAMES testFindFile testFindFile.exe DOC"Path to the git executable")message(STATUS"Test_EXE =${Test_EXE}")# 在指定的目录下查找库文件find_library(MYLIB_LIB NAMES my.lib HINTS"E:/cmakeLearning/chap2/12findpro"PATH_SUFFIXES lib lib64 REQUIRED)message(STATUS"MYLIB_LIB =${MYLIB_LIB}")# MYLIB_LIB = E:/cmakeLearning/chap2/12findpro/my.lib