FindXXX.cmake
文件Find.cmake
格式命名(如 FindAdd.cmake
)13。find_path
和 find_library
定位头文件和库文件路径12。XXX_FOUND
)以标记依赖是否找到23。find_package_handle_standard_args
标准化输出结果35。示例代码片段:
# FindAdd.cmake find_path(ADD_INCLUDE_DIR add.h /usr/include /usr/local/include) find_library(ADD_LIBRARY NAMES add PATHS /usr/lib /usr/local/lib) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(Add DEFAULT_MSG ADD_INCLUDE_DIR ADD_LIBRARY) if(ADD_FOUND) set(ADD_INCLUDE_DIRS ${ADD_INCLUDE_DIR}) set(ADD_LIBRARIES ${ADD_LIBRARY}) endif()
FindXXX.cmake
文件放置在项目的 cmake/modules/
目录下23。CMAKE_MODULE_PATH
:在 CMakeLists.txt
中指定模块搜索路径: list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/modules")
CMakeLists.txt
中调用模块find_package
:通过模块模式调用自定义模块14: find_package(Add REQUIRED) # REQUIRED 表示必须找到依赖
target_include_directories(MyApp PRIVATE ${ADD_INCLUDE_DIRS}) target_link_libraries(MyApp PRIVATE ${ADD_LIBRARIES})
_INCLUDE_DIR
和 _LIBRARY
的命名约定,避免冲突12。PATHS
参数扩展搜索范围(如系统目录和自定义路径)35。if(XXX_VERSION VERSION_GREATER 1.0)
)58。mark_as_advanced
标记变量为高级选项,减少用户可见的冗余变量35。编写 FindAdd.cmake
:
find_path(ADD_INCLUDE_DIR add.h PATHS /opt/add/include ${CMAKE_SOURCE_DIR}/thirdparty/include ) find_library(ADD_LIBRARY add PATHS /opt/add/lib ${CMAKE_SOURCE_DIR}/thirdparty/lib ) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(Add REQUIRED_VARS ADD_INCLUDE_DIR ADD_LIBRARY )
调用模块:
cmake_minimum_required(VERSION 3.10) project(MyApp) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") find_package(Add REQUIRED) add_executable(MyApp main.cpp) target_include_directories(MyApp PRIVATE ${ADD_INCLUDE_DIR}) target_link_libraries(MyApp PRIVATE ${ADD_LIBRARY})
message
输出关键变量(如 message("Add include dir: ${ADD_INCLUDE_DIR}")
)12。CMakeCache.txt
以重置缓存35。通过上述方法,可高效管理项目依赖并实现跨平台构建12。
cmake 如何使用CMAKE_PREFIX_PATH指定库目录
在 CMake 中,CMAKE_PREFIX_PATH
是一个关键变量,用于指定 第三方库的安装前缀路径,帮助 CMake 自动定位头文件、库文件和其他依赖资源。以下是详细使用方法:
CMAKE_PREFIX_PATH
的常用方式在运行 cmake
时直接传递路径,多个路径用 分号 ;
分隔(适用于所有操作系统):
cmake .. -DCMAKE_PREFIX_PATH="/path/to/lib1;/path/to/lib2"
在终端中设置环境变量:
export CMAKE_PREFIX_PATH="/path/to/lib1:/path/to/lib2"
set CMAKE_PREFIX_PATH=C:\path\to\lib1;C:\path\to\lib2
CMakeLists.txt
中指定在项目的顶层 CMakeLists.txt
中添加:
set(CMAKE_PREFIX_PATH "/path/to/lib1" "/path/to/lib2") # 或 set(CMAKE_PREFIX_PATH "/path/to/lib1;/path/to/lib2")
CMAKE_PREFIX_PATH
的路径规则/usr/local
或 C:/libs
。/include
、/lib
)。CMAKE_PREFIX_PATH
中的每个路径。/lib
、/include
等标准子目录。find_package
使用假设需要查找 AsmJit
库,且其安装在 /opt/asmjit
目录下:
# 命令行指定路径 cmake .. -DCMAKE_PREFIX_PATH="/opt/asmjit"
在 CMakeLists.txt
中调用:
find_package(AsmJit REQUIRED) target_link_libraries(MyApp PRIVATE AsmJit::AsmJit)
打开生成的 CMakeCache.txt
文件,搜索 CMAKE_PREFIX_PATH
的值:
CMAKE_PREFIX_PATH:STRING=/path/to/lib1;/path/to/lib2
message
输出路径在 CMakeLists.txt
中添加调试信息:
message(STATUS "CMAKE_PREFIX_PATH = ${CMAKE_PREFIX_PATH}")
运行 cmake
时会在终端显示路径值。
build/
或 CMakeCache.txt
)后重新生成。CMAKE_PREFIX_PATH
中: cmake .. -DCMAKE_PREFIX_PATH="/opt/asmjit;/usr/local/qt5"
假设 AsmJit 安装在 /opt/asmjit
:
# 1. 配置 CMake cmake .. -DCMAKE_PREFIX_PATH="/opt/asmjit" # 2. 构建项目 make # 3. 检查 AsmJit 是否被正确链接 ldd ./MyApp | grep asmjit
通过正确设置 CMAKE_PREFIX_PATH
,CMake 可以自动定位依赖库,避免手动编写 find_path
和 find_library
的繁琐操作。
CMAKE_PREFIX_PATH
查找库的逻辑CMake 在 CMAKE_PREFIX_PATH
指定的路径下,按以下结构搜索库的配置文件(如 XXXConfig.cmake
或 XXX-config.cmake
)13:
/lib/cmake/<库名>/
或 /<库名>/
。<库名>Config.cmake
<库名>-config.cmake
示例:
若 CMAKE_PREFIX_PATH
设置为 /opt/mylib
,CMake 会尝试在以下路径查找:
/opt/mylib/lib/cmake/MyLib/MyLibConfig.cmake /opt/mylib/MyLib/MyLibConfig.cmake
CMAKE_PREFIX_PATH
中路径的先后顺序依次查找,先列出的路径优先级更高16。lib
、include
),但需符合标准目录结构35。CMAKE_PREFIX_PATH
的优先级高于系统默认路径(如 /usr/local
)46。假设需要查找 AsmJit
和 Qt5
两个库,分别安装在 /opt/asmjit
和 /opt/qt5
:
# 命令行设置多个路径(分号分隔) cmake .. -DCMAKE_PREFIX_PATH="/opt/asmjit;/opt/qt5"
CMake 会依次在以下路径查找配置文件:
/opt/asmjit/lib/cmake/AsmJit/AsmJitConfig.cmake /opt/qt5/lib/cmake/Qt5/Qt5Config.cmake
路径格式要求:
/opt/mylib/x64
),需在 CMAKE_PREFIX_PATH
中指定完整路径,或通过 PATHS
参数扩展子目录5。调试方法:
message(STATUS "Searching in: ${CMAKE_PREFIX_PATH}")
输出路径值8。CMakeCache.txt
确认 CMAKE_PREFIX_PATH
是否生效16。与其他参数结合:
XXX_DIR
(如 Qt5_DIR
),其优先级高于 CMAKE_PREFIX_PATH
48。通过合理配置 CMAKE_PREFIX_PATH
,CMake 可高效定位依赖库的配置文件,简化跨平台构建过程