添加配置用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]