书接上回,前面我们已经介绍了动态库、静态库的构建和使用,这里将介绍项目构建完成后的安装和打包发布
上一节:
动态库、静态库的构建与使用_爱钓鱼的歪猴的博客-CSDN博客
目录
一、安装
1、理解install命令
2、CMakeLists.txt
3、执行安装
二、打包发布
CMakeLists.txt
打包发布
三、个人总结
一、安装
1、理解install命令
nstall 命令用于指定文件的输出路径,这个文件可以是二进制执行文件、动态库文件、静态库文件,甚至是目录。通俗的来讲,install 其实就是把生成的文件统一拷贝到某个目录下,方便打包或者转移。
install 在不同场合,使用的格式也会有所不同,大体可分为安装目标文件、安装目录。需要注意的是,运行 make 命令时不会执行install命令,运行 make install 才会执行 install 命令。
2、CMakeLists.txt
直接看最后三个命令即可
# 添加源文件目录
aux_source_directory(./ SOURCES)
# 生成可执行文件
add_executable(example ${SOURCES})
# 添加动态库 得到libhaha.so动态库文件
add_library(haha SHARED haha.cpp)
# 给动态库添加版本号 得到libhaha.so.1.2 同时有两个链接
set_target_properties(haha PROPERTIES VERSION 1.2 SOVERSION 1)
# 添加静态库 得到libhaha.a静态库文件
add_library(haha_static STATIC haha.cpp)
# 更改输出库的名字 libhah.a 修改为 libhello.a
set_target_properties(haha_static PROPERTIES OUTPUT_NAME "hello")
# 设置可执行文件的输出路径 这是是工程目录下的lib目录
SET(EXECUTABLE_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/lib")
# 设置库文件的输出路径 这是是工程目录下的lib目录
SET(LIBRARY_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/lib")
# 设置统一安装路径前缀 该路径必须存在
set(CMAKE_INSTALL_PREFIX /home/jason/work/my-deploy/example/my_install_test)
# 安装 目标文件(TARGETS)
install(TARGETS ${PROJECT_NAME} haha_static haha #等待安装的目标文件 可执行文件 静态库 动态库
RUNTIME DESTINATION bin # 安装 可执行文件到指定目录下的bin目录
LIBRARY DESTINATION lib # 安装 动态库文件到指定目录下的lib目录
ARCHIVE DESTINATION static_lib) # 安装静态库文件到指定目录下的static_lib目录
# 安装普通文件 (FILES)
install(FILES haha.h DESTINATION include)
3、执行安装
在项目所在目录打开终端,执行:
mkdir build && cd build
cmake ..
make
make install
查看是否都安装都指定目录:
这些目录都是CMake install 自动生成的
查看文件是否在目录下:
二、打包发布
CMakeLists.txt
# 添加源文件目录
#aux_source_directory(./ SOURCES)
#file(GLOB SRC_LIST "*.cpp" "src/*.cpp" "src/modules/*.cpp")
# 生成可执行文件
add_executable(example main.cpp)
# 添加动态库 得到libhaha.so动态库文件
add_library(haha SHARED haha.cpp)
# 给动态库添加版本号 得到libhaha.so.1.2 同时有两个链接
set_target_properties(haha PROPERTIES VERSION 1.2 SOVERSION 1)
# 链接刚刚生成的动态链接库 到可执行文件
target_link_libraries(${PROJECT_NAME} haha)
############################## deb 打包配置 ################################
# 说明要生成的是deb包
SET(CPACK_GENERATOR "DEB")
# 设置版本
set(CPACK_PACKAGE_VERSION "1.0.0")
# 还可通过设置每个版本字段号设置版本
#设置版本信息如下
#SET(CPACK_PACKAGE_VERSION_MAJOR "1")
#SET(CPACK_PACKAGE_VERSION_MINOR "0")
#SET(CPACK_PACKAGE_VERSION_PATCH "0")
# 设置安装包的包名,打包好的包将会是<packagename>-<version>-<sys>.deb,如果不设置,默认就是工程名
set(CPACK_PACKAGE_NAME "haha")
# 设置程序名,就是程序安装之后的名字
set(CPACK_DEBIAN_PACKAGE_NAME "haha" )
# 设置架构
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "amd64") # amd64 与 x86_64 同意
# 设置依赖
#SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= 2.3.1-6)") # libc6,即Linux下的C函数库
# 设置descripation
SET(CPACK_PACKAGE_DESCRIPTION "just a cpack test")
# 设置联系方式
SET(CPACK_PACKAGE_CONTACT "xxxxxxxxxx@qq.com")
# 设置维护人
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "jason")
# 包含Cpack
include(CPack)
打包发布
在项目下开启终端运行:
mkdir buid && cd build
cmake ..
make
make package
成功生成deb包
我们用pkdg查看一下deb包的基本信息
我们还可以看看deb包将要安装的路径所在
最后分享一些dpkg相关常用命令
三、个人总结
上面的haha包源码的效果在在中控台打印 haha,将其打包为deb包,安装好后,也没有多大用。要想起能有功能,那工作量应该不小。
对于笔者而言,将一个项目构建成静态库或动态库,或将可执行文件、库文件、头文件安装到别的地方,或许更有意义。举一个不太恰当的例子:新的电脑不用再安装一些软件,比如我已经将OpenCV的库文件、头文件和可执行文件安装好了。
参考:
【cmake篇】install 命令_仲夏夜之梦~的博客-CSDN博客
C++编译之(4)-进阶-cmake设置install及package配置_cmake install指令_丰色木夕的博客-CSDN博客
【cmake学习】cmake 引入第三方库(头文件目录、库目录、库文件)_cmake添加第三方库_仲夏夜之梦~的博客-CSDN博客