求CMake下简洁直接的find_package配套配置文件实现示例
mydep依赖CMake配置文件示例
目录结构
先确认你的依赖目录结构如下:
mydep/ ├── include/ │ └── mydep.h ├── lib/ │ ├── mydep.lib │ └── mydep.dll ├── mydep-config.cmake └── mydep-target.cmake
mydep-config.cmake 内容
# 获取当前配置文件所在目录 get_filename_component(MYDEP_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) # 引入目标配置文件 include("${MYDEP_CMAKE_DIR}/mydep-target.cmake") # 校验核心文件是否存在 if(NOT EXISTS "${MYDEP_INCLUDE_DIR}/mydep.h" OR NOT EXISTS "${MYDEP_LIB_DIR}/mydep.lib") message(FATAL_ERROR "mydep依赖文件缺失,请检查include和lib目录") endif()
mydep-target.cmake 内容
# 定义依赖的基础路径 set(MYDEP_INCLUDE_DIR "${MYDEP_CMAKE_DIR}/include") set(MYDEP_LIB_DIR "${MYDEP_CMAKE_DIR}/lib") # 创建导入式目标 add_library(mydep SHARED IMPORTED) # 配置目标的头文件搜索路径(自动传递给链接此目标的项目) set_target_properties(mydep PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${MYDEP_INCLUDE_DIR}" ) # 配置Windows平台的导入库和动态库路径 set_target_properties(mydep PROPERTIES IMPORTED_IMPLIB "${MYDEP_LIB_DIR}/mydep.lib" IMPORTED_LOCATION "${MYDEP_LIB_DIR}/mydep.dll" ) # 自定义函数:将mydep.dll复制到目标程序的输出目录 function(copy_mydep_dll target) add_custom_command(TARGET ${target} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${MYDEP_LIB_DIR}/mydep.dll" $<TARGET_FILE_DIR:${target}> COMMENT "Copying mydep.dll to output directory..." ) endfunction()
在你的项目中使用
在项目根目录的CMakeLists.txt里添加以下内容:
# 查找mydep依赖(需确保mydep根目录在CMAKE_PREFIX_PATH中,或通过-DMYDEP_DIR指定路径) find_package(mydep REQUIRED) # 创建你的目标程序 add_executable(myapp main.cpp) # 链接mydep依赖 target_link_libraries(myapp PRIVATE mydep) # 调用函数复制DLL到输出目录 copy_mydep_dll(myapp)
额外说明
- 若需区分32/64位架构,可在
lib目录下拆分x86/x64子目录,然后在配置文件中通过CMAKE_SIZEOF_VOID_P判断加载对应路径的库 - 运行CMake时,可通过
-DCMAKE_PREFIX_PATH=/path/to/mydep指定依赖的根目录
内容的提问来源于stack exchange,提问作者Sean Michael McGhee
相关产品推荐
相关产品推荐

