cpack打包详解-万字总结

CMake是一个非常流行的跨平台构建系统,它允许用户使用一致的方式构建和管理项目。CPack是CMake的一部分,是一个用于创建软件包的工具,可以将您的项目打包成多种不同的格式,例如ZIP,TGZ,RPM,DEB和NSIS。CPack可以与CMake的构建系统无缝集成。

下面是一个简单的使用CPack的CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.0) 
project(MyProject) 
# 添加源代码
add_executable(MyProject main.cpp)
# 添加依赖库 
find_package(Boost REQUIRED)
target_link_libraries(MyProject PRIVATE Boost::boost)
# 安装文件
install(TARGETS MyProject DESTINATION bin)
# 打包 
set(CPACK_PACKAGE_NAME "MyProject")
set(CPACK_PACKAGE_VERSION "1.0.0") 
set(CPACK_GENERATOR "ZIP") 
include(CPack) 

上述代码中,find_package命令用于查找依赖库Boost,target_link_libraries命令用于将依赖库链接到可执行文件中。install命令用于指定在安装时将可执行文件复制到哪个目录中。

最后,set(CPACK_GENERATOR “ZIP”)命令指定要生成的包格式为ZIP,并且使用include(CPack)来将CPack集成到CMake构建系统中。如果您要生成其他类型的软件包,请将CPACK_GENERATOR更改为所需的类型。

如果您需要将其他文件(例如头文件)打包到软件包中,可以使用install命令的FILES参数,如下所示:

install(FILES myheader.h DESTINATION include) 

上述代码将myheader.h文件复制到安装目录的include子目录中。

请注意,使用CPack生成软件包之前,必须先使用CMake构建项目。可以使用以下命令进行构建:

cmake .
cmake . make 

构建成功后,可以使用以下命令生成软件包:

cpack 

此命令将在当前目录中生成一个ZIP文件,其中包含您的项目可执行文件和其他文件(例如头文件和依赖库)。

如果您的项目有多个可执行文件,您可以通过在install命令中指定TARGETS参数来安装所有可执行文件。例如,以下代码安装了两个可执行文件:


# 添加源代码 
add_executable(MyProject1 main1.cpp) 
add_executable(MyProject2 main2.cpp) 
# 添加依赖库 
find_package(Boost REQUIRED) 
target_link_libraries(MyProject1 PRIVATE Boost::boost) 
target_link_libraries(MyProject2 PRIVATE Boost::boost) 
# 安装文件 
install(TARGETS MyProject1 MyProject2 DESTINATION bin) 
# 打包 
set(CPACK_PACKAGE_NAME "MyProject") 
set(CPACK_PACKAGE_VERSION "1.0.0") 
set(CPACK_GENERATOR "ZIP") 
include(CPack) 

这将在安装时将两个可执行文件复制到bin目录中。

如果您的项目依赖于其他库或框架,您可能需要将这些依赖项打包到软件包中。CPack提供了几种不同的方式来实现这一点,取决于您的项目使用的库和您的目标平台。以下是一些可能有用的CPack变量和选项:

CPACK_INCLUDE_TOPLEVEL_DIRECTORY:指定是否将软件包中的文件放在顶级目录下。默认情况下,CPack会将所有文件打包到一个顶级目录中,该目录的名称由CPACK_PACKAGE_NAME变量指定。

CPACK_RESOURCE_FILE_LICENSE:指定要包含在软件包中的许可证文件的路径。

CPACK_PACKAGE_FILE_NAME:指定软件包的文件名,通常为{CPACK_PACKAGE_NAME}-{CPACK_PACKAGE_VERSION}-{CPACK_SYSTEM_NAME}。{CPACK_SYSTEM_NAME}变量是一个由CPack确定的目标平台的字符串。

CPACK_RPM_PACKAGE_REQUIRES:指定RPM软件包需要的其他软件包。该变量应该设置为一个逗号分隔的字符串列表,每个字符串表示一个软件包。

CPACK_DEBIAN_PACKAGE_DEPENDS:指定DEB软件包需要的其他软件包。该变量应该设置为一个逗号分隔的字符串列表,每个字符串表示一个软件包。

CPACK_GENERATOR:指定要生成的软件包类型。例如,如果要生成RPM软件包,请将此变量设置为RPM。

您可以在CMake文档中找到更多关于CPack的信息,包括如何将依赖库打包到软件包中的详细说明。

对于依赖库的打包,以下是一个示例:

# 添加源代码 
add_executable(MyProject main.cpp) 
# 添加依赖库 
find_package(Boost REQUIRED) 
target_link_libraries(MyProject PRIVATE Boost::boost) 
# 安装文件和依赖库 
install(TARGETS MyProject DESTINATION bin) 
install(DIRECTORY ${Boost_INCLUDE_DIRS} DESTINATION include) 
# 打包 
set(CPACK_PACKAGE_NAME "MyProject") 
set(CPACK_PACKAGE_VERSION "1.0.0") 
set(CPACK_GENERATOR "ZIP") 
set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY OFF) 
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE") 
set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CPACK_SYSTEM_NAME}") set(CPACK_RPM_PACKAGE_REQUIRES "boost >= 1.70") 
set(CPACK_DEBIAN_PACKAGE_DEPENDS "libboost-all-dev") 
include(CPack) 

这个例子假设您的项目依赖于Boost库。find_package命令用于查找Boost库并将其添加到您的项目中。然后,target_link_libraries命令用于将依赖库链接到您的可执行文件中。

为了安装依赖库,您可以使用install命令并指定要安装的目录。在这个例子中,{Boost_INCLUDE_DIRS}变量包含Boost库的头文件路径。{CPACK_SYSTEM_NAME}变量是一个由CPack确定的目标平台的字符串。

最后,您可以使用各种CPack选项和变量来生成软件包,包括CPACK_INCLUDE_TOPLEVEL_DIRECTORY、CPACK_RESOURCE_FILE_LICENSE、CPACK_PACKAGE_FILE_NAME、CPACK_RPM_PACKAGE_REQUIRES和CPACK_DEBIAN_PACKAGE_DEPENDS等。

请注意,不同的平台和包格式可能需要不同的选项和变量。请查阅CMake和CPack文档以获取更多信息。

另外一个示例,假设您的项目依赖于一个外部库,并且该库未安装在系统上。在这种情况下,您需要在项目中使用ExternalProject_Add命令来下载和构建该库。以下是一个例子:


# 添加外部依赖库 
include(ExternalProject)
set(EXTERNAL_INSTALL_LOCATION ${CMAKE_BINARY_DIR}/external) 
ExternalProject_Add( MyLibrary PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/extern GIT_REPOSITORY https://github.com/MyLibrary.git GIT_TAG master CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXTERNAL_INSTALL_LOCATION} ) 
# 添加源代码 
add_executable(MyProject main.cpp) 
# 添加依赖库 
find_package(MyLibrary REQUIRED) 
target_link_libraries(MyProject PRIVATE MyLibrary::MyLibrary) 
# 安装文件和依赖库 
install(TARGETS MyProject DESTINATION bin) 
install(DIRECTORY ${EXTERNAL_INSTALL_LOCATION}/include/MyLibrary DESTINATION include) 
# 打包 
set(CPACK_PACKAGE_NAME "MyProject") 
set(CPACK_PACKAGE_VERSION "1.0.0") 
set(CPACK_GENERATOR "ZIP") 
set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY OFF) 
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE") 
set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CPACK_SYSTEM_NAME}") set(CPACK_RPM_PACKAGE_REQUIRES "MyLibrary >= 1.0") 
set(CPACK_DEBIAN_PACKAGE_DEPENDS "libmylibrary-dev") 
include(CPack) 

在这个例子中,ExternalProject_Add命令用于下载和构建一个名为MyLibrary的外部依赖库。PREFIX选项指定下载和构建的位置。GIT_REPOSITORY和GIT_TAG选项指定了该库的Git仓库位置和要使用的版本。

find_package命令用于查找已安装的MyLibrary库。如果您的项目依赖于未安装的库,您可以使用find_package命令的CONFIG选项来指定MyLibrary的构建文件路径。

在install命令中,${EXTERNAL_INSTALL_LOCATION}变量包含MyLibrary库的安装路径。

最后,使用各种CPack选项和变量来生成软件包。

请注意,该示例中的选项和变量取决于使用的包格式和目标平台。查看CMake和CPack文档以获取更多信息。

对于头文件库的打包,以下是一个示例:

# 添加源代码 
add_executable(MyProject main.cpp) 
# 添加头文件库 
set(MYLIB_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/include) 
target_include_directories(MyProject PRIVATE ${MYLIB_INCLUDE_DIRS}) 
# 安装文件和头文件库 
install(TARGETS MyProject DESTINATION bin) 
install(DIRECTORY ${MYLIB_INCLUDE_DIRS} DESTINATION include) 
# 打包 
set(CPACK_PACKAGE_NAME "MyProject") 
set(CPACK_PACKAGE_VERSION "1.0.0") 
set(CPACK_GENERATOR "ZIP") 
set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY OFF) 
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE") 
set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CPACK_SYSTEM_NAME}") 
include(CPack) 

在这个例子中,假设您的项目包含一个名为MyLibrary的头文件库。您可以使用target_include_directories命令将其添加到您的项目中。 C M A K E C U R R E N T S O U R C E D I R 变 量 是 当 前 C M a k e L i s t s . t x t 文 件 所 在 的 目 录 。 {CMAKE_CURRENT_SOURCE_DIR}变量是当前CMakeLists.txt文件所在的目录。 CMAKECURRENTSOURCEDIRCMakeLists.txt{MYLIB_INCLUDE_DIRS}变量是MyLibrary库的头文件路径。

在install命令中,${MYLIB_INCLUDE_DIRS}变量包含MyLibrary库的头文件路径。

最后,使用各种CPack选项和变量来生成软件包。

请注意,这个示例只打包了头文件库。如果MyLibrary包含其他文件,例如链接库或可执行文件,则您需要将这些文件添加到项目中,并在install命令中指定它们的目标路径。

如果您的项目依赖于其他共享库,并且这些库未安装在系统上,则您需要在项目中使用ExternalProject_Add命令来下载和构建这些库。以下是一个包含依赖项的示例:


# 添加外部依赖库 
include(ExternalProject) 
set(EXTERNAL_INSTALL_LOCATION ${CMAKE_BINARY_DIR}/external) 
ExternalProject_Add( MyLibrary PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/extern GIT_REPOSITORY https://github.com/MyLibrary.git GIT_TAG master CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXTERNAL_INSTALL_LOCATION} ) 
# 添加源代码 
add_executable(MyProject main.cpp) 
# 添加依赖库 
find_library(MYLIB_LIBRARY MyLibrary ${EXTERNAL_INSTALL_LOCATION}/lib) 
target_link_libraries(MyProject PRIVATE ${MYLIB_LIBRARY}) 
# 安装文件和依赖库 
install(TARGETS MyProject DESTINATION bin) 
install(DIRECTORY ${EXTERNAL_INSTALL_LOCATION}/include/MyLibrary DESTINATION include) 
install(FILES ${MYLIB_LIBRARY} DESTINATION lib) 
# 打包 
set(CPACK_PACKAGE_NAME "MyProject") 
set(CPACK_PACKAGE_VERSION "1.0.0") 
set(CPACK_GENERATOR "ZIP") 
set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY OFF) 
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE") 
set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CPACK_SYSTEM_NAME}") set(CPACK_RPM_PACKAGE_REQUIRES "MyLibrary >= 1.0") 
set(CPACK_DEBIAN_PACKAGE_DEPENDS "libmylibrary-dev") 
include(CPack) 

在这个示例中,ExternalProject_Add命令用于下载和构建名为MyLibrary的外部依赖库。${EXTERNAL_INSTALL_LOCATION}变量包含该库的安装路径。

find_library命令用于查找已安装的MyLibrary库。如果您的项目依赖于未安装的库,您可以使用find_library命令的PATHS选项来指定MyLibrary的构建文件路径。

在install命令中, M Y L I B L I B R A R Y 变 量 包 含 M y L i b r a r y 库 的 路 径 。 {MYLIB_LIBRARY}变量包含MyLibrary库的路径。 MYLIBLIBRARYMyLibrary{EXTERNAL_INSTALL_LOCATION}/lib变量是MyLibrary库的安装路径。

最后,使用各种CPack选项和变量来生成软件包。

请注意,该示例中的选项和变量取决于使用的包格式和目标平台。查看CMake和CPack文档以获取更多信息。

以下是一个包含多个外部依赖库的示例:

# 添加外部依赖库 
include(ExternalProject) 
set(EXTERNAL_INSTALL_LOCATION ${CMAKE_BINARY_DIR}/external) 
ExternalProject_Add( MyLibrary1 PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/extern GIT_REPOSITORY https://github.com/MyLibrary1.git GIT_TAG master CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXTERNAL_INSTALL_LOCATION} ) 
ExternalProject_Add( MyLibrary2 PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/extern GIT_REPOSITORY https://github.com/MyLibrary2.git GIT_TAG master CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXTERNAL_INSTALL_LOCATION} ) 
# 添加源代码 
add_executable(MyProject main.cpp) 
# 添加依赖库 
find_library(MYLIB1_LIBRARY MyLibrary1 ${EXTERNAL_INSTALL_LOCATION}/lib) target_link_libraries(MyProject PRIVATE ${MYLIB1_LIBRARY}) 
find_library(MYLIB2_LIBRARY MyLibrary2 ${EXTERNAL_INSTALL_LOCATION}/lib) target_link_libraries(MyProject PRIVATE ${MYLIB2_LIBRARY}) 
# 安装文件和依赖库 
install(TARGETS MyProject DESTINATION bin) 
install(DIRECTORY ${EXTERNAL_INSTALL_LOCATION}/include/MyLibrary1 DESTINATION include) 
install(FILES ${MYLIB1_LIBRARY} DESTINATION lib) 
install(DIRECTORY ${EXTERNAL_INSTALL_LOCATION}/include/MyLibrary2 DESTINATION include) 
install(FILES ${MYLIB2_LIBRARY} DESTINATION lib) 
# 打包 
set(CPACK_PACKAGE_NAME "MyProject") 
set(CPACK_PACKAGE_VERSION "1.0.0") 
set(CPACK_GENERATOR "ZIP") 
set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY OFF) 
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE") 
set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CPACK_SYSTEM_NAME}") set(CPACK_RPM_PACKAGE_REQUIRES "MyLibrary1 >= 1.0; MyLibrary2 >= 2.0") set(CPACK_DEBIAN_PACKAGE_DEPENDS "libmylibrary1-dev, libmylibrary2-dev") 
include(CPack) 

在这个示例中,我们添加了两个外部依赖库:MyLibrary1和MyLibrary2。 M Y L I B 1 L I B R A R Y 和 {MYLIB1_LIBRARY}和 MYLIB1LIBRARY{MYLIB2_LIBRARY}变量分别包含这些库的路径。

在install命令中,我们将每个依赖库的头文件和库文件分别安装到不同的目录中。

请注意,这个示例中的选项和变量取决于使用的包格式和目标平台。查看CMake和CPack文档以获取更多信息。

接下来,我们来看看如何使用CPack打包。

在CMakeLists.txt文件末尾,我们添加以下CPack配置:


set(CPACK_GENERATOR ZIP) 
set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${PROJECT_VERSION}") 
include(CPack) 

这将生成一个ZIP格式的包,包名为 C M A K E P R O J E C T N A M E − {CMAKE_PROJECT_NAME}- CMAKEPROJECTNAME{PROJECT_VERSION}。

在命令行中,我们可以使用以下命令来构建和打包我们的项目:


mkdir build 
cd build 
cmake .. 
cmake --build . 
cpack 

此时,CPack将使用我们在CMakeLists.txt中指定的配置来生成一个ZIP包。我们可以在生成的build目录中找到它。

如果我们要生成其他格式的包,例如RPM、DEB或NSIS,请修改CPACK_GENERATOR变量的值。不同的格式具有不同的选项和参数,您可以在CPack文档中找到更多信息。

对于包含多个外部依赖库的项目,我们可以使用CPack的一些特殊功能来自动包含这些依赖项。

例如,我们可以使用CPACK_DEBIAN_PACKAGE_SHLIBDEPS和CPACK_RPM_PACKAGE_REQUIRES变量来告诉CPack在打包时包含依赖项。这些变量接受一个类似于依赖项列表的字符串,指定所需的依赖项及其版本。

下面是一个示例,使用CPack打包具有两个依赖项的项目:

# CMakeLists.txt 
# 添加外部依赖库 
find_package(Boost REQUIRED COMPONENTS system filesystem) 
# 添加源代码 
add_executable(MyProject main.cpp) 
# 添加依赖库 
target_link_libraries(MyProject PRIVATE Boost::system Boost::filesystem) 
# 安装文件和依赖库 
install(TARGETS MyProject DESTINATION bin) 
# 打包 
set(CPACK_PACKAGE_NAME "MyProject") 
set(CPACK_PACKAGE_VERSION "1.0.0") 
set(CPACK_GENERATOR "ZIP") 
set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY OFF) 
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE") 
set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CPACK_SYSTEM_NAME}") set(CPACK_RPM_PACKAGE_REQUIRES "boost-system >= 1.72, boost-filesystem >= 1.72") set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON) 
set(CPACK_DEBIAN_PACKAGE_DEPENDS "libboost-system1.72-dev, libboost-filesystem1.72-dev") include(CPack) 

在这个示例中,我们使用find_package命令来查找Boost库,并将其链接到我们的项目中。

在CPack配置中,我们使用CPACK_RPM_PACKAGE_REQUIRES变量来指定RPM包的依赖项,使用CPACK_DEBIAN_PACKAGE_DEPENDS变量来指定DEB包的依赖项。请注意,这些变量的值必须符合所需包管理器的语法。另外,对于DEB包,我们还设置了CPACK_DEBIAN_PACKAGE_SHLIBDEPS变量为ON,以自动包含库依赖项。

现在,我们可以使用与前面相同的步骤来构建和打包项目,CPack将自动包含所需的依赖项。

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
要使用CPack打包外部库,需要按照以下步骤操作: 1.在CMakeLists.txt文件中定义要打包的目标,包括库文件和头文件。例如: ``` add_library(mylib SHARED mylib.cpp) target_include_directories(mylib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) ``` 2.在CMakeLists.txt文件中添加CPack相关设置。例如: ``` set(CPACK_GENERATOR "ZIP") set(CPACK_PACKAGE_NAME "mylib") set(CPACK_PACKAGE_VERSION "1.0.0") set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "My library") set(CPACK_PACKAGE_VENDOR "My Company") set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}") set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE") set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-src") set(CPACK_SOURCE_GENERATOR "ZIP") set(CPACK_SOURCE_IGNORE_FILES "/build/" "/.git/" "/.idea/" "/tmp/" "/dist/" ) include(CPack) ``` 其中,`CPACK_GENERATOR`设置打包格式,`CPACK_PACKAGE_NAME`设置包名,`CPACK_PACKAGE_VERSION`设置版本号,`CPACK_PACKAGE_DESCRIPTION_SUMMARY`设置简介,`CPACK_PACKAGE_VENDOR`设置厂商,`CPACK_PACKAGE_FILE_NAME`设置生成包的文件名,`CPACK_SOURCE_PACKAGE_FILE_NAME`设置源代码包的文件名,`CPACK_RESOURCE_FILE_LICENSE`设置许可证文件路径,`CPACK_SOURCE_IGNORE_FILES`设置忽略的文件。 3.使用`cpack`命令生成打包文件。例如: ``` $ mkdir build $ cd build $ cmake .. $ make $ cpack --config CPackConfig.cmake ``` 生成的打包文件会在build目录下生成。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZUSTAND

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值