添加配置用cpack打包程序
1.根cmake文件
cmake_minimum_required(VERSION 3.10)
project(ALL_BUILD VERSION 0.1.0 LANGUAGES C CXX)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 设置输出目录
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
add_subdirectory(testlib)
add_subdirectory(testlib2)
add_subdirectory(test)
# ========== CPack配置 ==========
set(CPACK_PACKAGE_NAME "MyProject")
set(CPACK_PACKAGE_VENDOR "MyCompany")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A test project with library and executable")
set(CPACK_PACKAGE_VERSION_MAJOR 0)
set(CPACK_PACKAGE_VERSION_MINOR 1)
set(CPACK_PACKAGE_VERSION_PATCH 0)
# 设置生成器为ZIP
set(CPACK_GENERATOR "ZIP")
# 设置组件
set(CPACK_COMPONENTS_ALL Libraries Application)
include(CPack)
2.动态库项目cmake文件
# 设置CMake最低版本要求
cmake_minimum_required(VERSION 3.10)
# 定义项目名称、版本和支持的语言
project(testlib VERSION 0.1.0 LANGUAGES C CXX)
# 设置C++标准为C++14,并强制要求
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 添加共享库目标
add_library(
${PROJECT_NAME} # 使用项目名称作为库名称
SHARED # 创建共享库(动态链接库)
func.cpp # 库的源文件
)
# 创建二进制目录下的include目录(用于存放生成的导出头文件)
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include)
# 设置库的头文件包含路径
target_include_directories(
${PROJECT_NAME}
PUBLIC # 公共包含路径,会传递给链接此库的目标
# 构建时包含源文件目录下的include目录
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
# 构建时包含二进制目录下的include目录(存放生成的导出头文件)
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
# 安装后包含安装目录下的include目录
$<INSTALL_INTERFACE:include>
)
# 生成导出头文件(用于处理Windows DLL导出/导入)
include(GenerateExportHeader)
generate_export_header(${PROJECT_NAME}
EXPORT_FILE_NAME ${CMAKE_CURRENT_BINARY_DIR}/include/${PROJECT_NAME}_export.h
)
# 安装生成的导出头文件
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/include/${PROJECT_NAME}_export.h
DESTINATION include # 安装到include目录
)
# 安装库文件(确保库文件被正确安装)
install(TARGETS ${PROJECT_NAME}
EXPORT ${PROJECT_NAME}Targets
RUNTIME DESTINATION bin COMPONENT Libraries # DLL文件
LIBRARY DESTINATION lib COMPONENT Libraries # 共享库文件
ARCHIVE DESTINATION lib COMPONENT Libraries # 静态库/导入库
INCLUDES DESTINATION include COMPONENT Libraries
)
# 安装头文件
install(DIRECTORY include/ DESTINATION include COMPONENT Libraries)
# 如果配置文件模板不存在,则创建默认模板
if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}Config.cmake.in")
file(WRITE ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}Config.cmake.in
"@PACKAGE_INIT@\n\ninclude(\"\${CMAKE_CURRENT_LIST_DIR}/${PROJECT_NAME}Targets.cmake\")\n")
endif()
# 配置包配置文件
include(CMakePackageConfigHelpers)
configure_package_config_file(
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}Config.cmake.in # 输入模板文件
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake # 输出配置文件
INSTALL_DESTINATION lib/cmake/${PROJECT_NAME} # 安装位置
)
# 生成包版本配置文件
write_basic_package_version_file(
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
VERSION ${PROJECT_VERSION} # 使用项目版本号
COMPATIBILITY SameMajorVersion # 兼容性策略:主版本相同即兼容
)
# 安装导出目标集文件
install(EXPORT ${PROJECT_NAME}Targets
FILE ${PROJECT_NAME}Targets.cmake # 目标集文件名
NAMESPACE ${PROJECT_NAME}:: # 命名空间前缀
DESTINATION lib/cmake/${PROJECT_NAME} # 安装位置
)
# 安装包配置文件和版本文件
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
DESTINATION lib/cmake/${PROJECT_NAME}
)
3.执行程序cmake文件
cmake_minimum_required(VERSION 3.10)
project(test VERSION 0.1.0 LANGUAGES C CXX)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_executable(
${PROJECT_NAME}
main.cpp
)
target_link_libraries(
${PROJECT_NAME}
PRIVATE
testlib
testlib2
)
# 安装可执行文件
install(TARGETS ${PROJECT_NAME}
RUNTIME DESTINATION bin
COMPONENT Application
)
# 安装依赖的DLL文件(Windows专用)
if(WIN32)
# 方法1:直接指定库文件
install(FILES $<TARGET_FILE:testlib>
DESTINATION bin
COMPONENT Application
CONFIGURATIONS Debug)
# 方法2:安装时复制DLL(更安全的方法)
# install(CODE "
# message(STATUS \"Copying DLL files...\")
# if(EXISTS \"${CMAKE_BINARY_DIR}/testlib/Debug/testlib.dll\")
# file(COPY \"${CMAKE_BINARY_DIR}/testlib/Debug/testlib.dll\"
# DESTINATION \"\${CMAKE_INSTALL_PREFIX}/bin\")
# endif()
# if(EXISTS \"${CMAKE_BINARY_DIR}/testlib/Release/testlib.dll\")
# file(COPY \"${CMAKE_BINARY_DIR}/testlib/Release/testlib.dll\"
# DESTINATION \"\${CMAKE_INSTALL_PREFIX}/bin\")
# endif()
# " COMPONENT Application)
endif()
4.打包命令
在构建文件夹下执行命令:
cpack -C [Debug/Release]