为动态库编写XX-config.cmake文件

演示动态库结构#

Copy Highlighter-hljs
. ├─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文件存放该动态库的脚本,内容如下
Copy Highlighter-hljs
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文件
Copy Highlighter-hljs
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${THIRD_PARTY_ROOT}/CTK/cmake # 这里就是上面演示动态库cmake路径 )
  • 使用find_package即可
Copy Highlighter-hljs
find_package(ctk)

find_package中的参数为 ctk-config.cmake名称中的ctk

  • 为项目链接该动态库
Copy Highlighter-hljs
target_link_libraries(${PROJECT_NAME} PRIVATE ctk::COMMON_TK )

ctk::COMMON_TK 为 ctk-config.cmake文件中的项目名称

posted @   mohist  阅读(197)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2020-09-21 clang编译代码报错:`_start': (.text+0x24): undefined reference to `main'
2020-09-21 cmake之指定clang(++)编译器为默认编译器
2020-09-21 cmake之错误【Modules/ExternalProject.cmake:3206 (_ep_add_download_command)....】
2020-09-21 c++11之获取模板函数的参数个数和函数返回值类型
点击右上角即可分享
微信分享提示
CONTENTS