为动态库编写XX-config.cmake文件
演示动态库结构
.
├─bin
│ ├─Debug
│ │ CTKCore.dll
│ │ CTKPluginFramework.dll
│ │
│ └─Release
│ CTKCore.dll
│ CTKPluginFramework.dll
│
├─cmake
│ ctk-config.cmake
│
├─include
│ ├─Core
│ │ │ CMakeLists.txt
│ │ │ ctkAbstractFactory.h
│ │
│ └─PluginFramework
│ │ CMakeLists.txt
│ | ctkObjectClassDefinition.h
│
└─lib
├─Debug
│ CTKCore.lib
│ CTKPluginFramework.lib
│
└─Release
CTKCore.lib
CTKPluginFramework.lib
ctk-config.cmake
- 该演示脚本支持多个库文件、多个头文件目录与可执行程序文件。
拷贝改改就能用
ctk-config.cmake
文件存放该动态库的脚本,内容如下
macro(SET_LIB_PROPERTIES )
set(options)
# TARGET_NAME-项目名称
# CONFIG_NAME - 配置管理器名字, 比如: DEBUG RELESE
set(oneValueArgs TARGET_NAME CONFIG_NAME )
# LIB_FILES - LIB文件
# BIN_FILES - 可执行程序
set(multiValueArgs LIB_FILES BIN_FILES )
# 解析参数列表
cmake_parse_arguments(LP "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
# 设置配置管理名称
set_property(TARGET ${LP_TARGET_NAME} APPEND PROPERTY IMPORTED_CONFIGURATIONS ${LP_CONFIG_NAME})
# 1. 绑定动态库
# ============================================================
set(BIN_FILE_LIST)
# 指定动态库: 动态库文件可能有多个文件
foreach(TMP_BIN_FILE ${LP_BIN_FILES})
# 将参数中的动态库解析出来
LIST(APPEND BIN_FILE_LIST ${TMP_BIN_FILE} )
# 绑定动态库
set_target_properties(${LP_TARGET_NAME}
PROPERTIES "IMPORTED_LOCATION_${LP_CONFIG_NAME}" ${TMP_BIN_FILE}
)
endforeach()
# 2. 绑定库文件
# ============================================================
set(LIB_FILE_LIST)
foreach(TMP_LIB_FILE ${LP_LIB_FILES})
# 将参数中的动态库解析出来
LIST(APPEND LIB_FILE_LIST ${TMP_LIB_FILE} )
# 指定lib库文件
set_target_properties(${LP_TARGET_NAME} PROPERTIES "IMPORTED_IMPLIB_${LP_CONFIG_NAME}" ${TMP_LIB_FILE})
endforeach()
endmacro()
# 指定根目录
set(LIB_ROOT ${CMAKE_CURRENT_LIST_DIR}/../)
if (NOT TARGET ctk::COMMON_TK)
# 建库
add_library(ctk::COMMON_TK SHARED IMPORTED)
endif()
if (TARGET ctk::COMMON_TK)
# 指定头文件属性
SET(CTK_INCLUDE_ROOT
${LIB_ROOT}/include/Core
${LIB_ROOT}/include/PluginFramework
)
set_property(TARGET ctk::COMMON_TK PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${CTK_INCLUDE_ROOT})
# 如果是windows,设置管理员权限。注意使用if需要配合endif使用
if (CMAKE_SYSTEM_NAME MATCHES "Windows")
# 有哪些库文件
set(LIB_FILE_LIST_DEBUG
${LIB_ROOT}/lib/Debug/CTKCore.lib
${LIB_ROOT}/lib/Debug/CTKPluginFramework.lib
)
# 由哪些可执行程序
set(BIN_FILE_LIST_DEBUG
${LIB_ROOT}/bin/Debug/CTKCore.dll
${LIB_ROOT}/bin/Debug/CTKPluginFramework.dll
)
# 有哪些库文件
set(LIB_FILE_LIST_RELASE
${LIB_ROOT}/lib/Debug/CTKCore.lib
${LIB_ROOT}/lib/Debug/CTKPluginFramework.lib
)
# 由哪些可执行程序
set(BIN_FILE_LIST_RELEASE
${LIB_ROOT}/bin/Debug/CTKCore.dll
${LIB_ROOT}/bin/Debug/CTKPluginFramework.dll
)
# DEBUG
SET_LIB_PROPERTIES(TARGET_NAME ctk::COMMON_TK CONFIG_NAME DEBUG LIB_FILES ${LIB_FILE_LIST_DEBUG} BIN_FILES ${BIN_FILE_LIST_DEBUG})
# RELEASE
SET_LIB_PROPERTIES(TARGET_NAME ctk::COMMON_TK CONFIG_NAME RELEASE LIB_FILES ${LIB_FILE_LIST_RELASE} BIN_FILES ${BIN_FILE_LIST_RELEASE})
else()
# todo
endif()
endif()
调用
- 告诉cmake, 应该去哪里找动态库对应的cmake文件
set(CMAKE_PREFIX_PATH
${CMAKE_PREFIX_PATH}
${THIRD_PARTY_ROOT}/CTK/cmake # 这里就是上面演示动态库cmake路径
)
- 使用
find_package
即可
find_package(ctk)
find_package中的参数为 ctk-config.cmake名称中的ctk
- 为项目链接该动态库
target_link_libraries(${PROJECT_NAME}
PRIVATE ctk::COMMON_TK
)
ctk::COMMON_TK 为 ctk-config.cmake文件中的项目名称