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

发布时间 2023-09-22 00:04:32作者: mohist

演示动态库结构

.
├─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文件中的项目名称