linux将c++程序制作成.deb

制作deb包

有的时候,我们需要将自己的程序(动态库或者可执行程序)打包成一个deb包,将deb包拷贝到其他的电脑,安装就可以使用包里面包含的函数或者可执行程序了.
linux将C++城西制作deb包,通过查找资料,找到了下面的几种方法.

方法1 使用cmake

​ C++ 工程大部分都是用 CMake 配置编译, 而 CPack 是 CMake 内置的工具,支持打包成多种格式的安装包。因为是 CMake 的内置工具,所以使用的方式也是通过在 CMakeLists.txt 配置参数,就能达到我们的需求。使用起来很方便,容易上手。

下面举一个简单的例子, 一个c++工程的目录结构如下:

.
└── cmake
    ├── CMakeLists.txt
    ├── include
    │   └── add_num.h
    ├── README.md
    └── src
        ├── add_num.cpp
        └── main.cpp

其中每个文件的内容如下:

include/add_num.h:

class A2DD
{
  int gx;
  int gy;

public:
  A2DD(int x,int y);
  int getSum();
};

src/add_num.cpp

#include "add_num.h"

A2DD::A2DD(int x,int y)
{
  gx = x;
  gy = y;
}

int A2DD::getSum()
{
  return gx + gy;
}

src/main.cpp

#include"add_num.h"
#include <iostream>

using namespace std;

int main(int argc, char *argv[]){
   A2DD a(1, 2);
   int res = a.getSum();
   cout << res << endl;
   return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.12.2)   # 指定cmake版本

project (addnum)   

add_library(addnum STATIC src/add_num.cpp)  #需要生成静态库,如果生成动态库的话,安装在新电脑上可能找不到 
target_include_directories( addnum 
    PUBLIC
        "${CMAKE_CURRENT_SOURCE_DIR}/include"
)

add_executable(addnumapp src/main.cpp)
target_link_libraries(addnumapp addnum)

install(TARGETS addnumapp
    COMPONENT linapp
    RUNTIME DESTINATION "/home/"
    LIBRARY DESTINATION "/home/"
    DESTINATION "/home/"
)

SET(CPACK_GENERATOR "DEB")
SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "KK") #required
INCLUDE(CPack)

CMakeLists.txt内容说明:

  • 第1行指定了我们正在使用的CMake版本。这是必需的说明。

  • 第3行-我们告诉CMake,我们想在此目录中创建一个项目,并将其称为“ addnum”。

  • 第5行-我们告诉CMake使用文件src / add_num.cpp创建一个名为“ addnum”的静态库。add_library()命令在CMake世界中创建我们所谓的“目标”。这里的目标是一个静态库。

  • 第6–9行—我们告诉CMake使用包含目录中的头文件作为目标“ addnum”。CMAKE_CURRENT_SOURCE_DIR是一个CMake变量,它提供了我们在其中调用目录的当前路径。

  • 第11行-我们告诉CMake使用src/main.cpp创建另一个目标“ addnumapp”。但是,这次我们告诉它使其成为可执行文件(与平台无关)而不是库。

  • 第12行-我们刚刚创建的可执行文件使用了在第5行中创建的库。因此,我们告诉CMake将库“ addnum”链接到可执行目标“ addnumapp”。

  • 此时,您应该能够运行CMake并获取可以从命令行运行并执行它的内置可执行文件。到目前为止,通过运行“ g ++ main.cpp”,我们已经完全完成了以前的工作。

  • CMake自动选择系统上安装的编译器。因此,您不必担心显式调用编译器。

  • 第14-19行-我们使用install()命令告诉CMake在安装时要做什么。我们告诉命令我们要用于安装程序的目标(“ addnumapp”)。我们还告诉目标位置我们想要安装的位置,在这种情况下,它是“ home/”目录。RUNTIME和LIBRARY目标指定了在我们有其他库的情况下希望放置库的目标。

  • 第21-23行-CPack是CMake使用的打包工具。这些说明是不言自明的。

生成deb安装包

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

执行完上述命令以后,在build目录下生成了addnum-0.1.1-Linux.deb。

打包完成后,我们可以通过以下命令查看一下这个deb软件包的信息和内容:

dpkg-deb -I <deb包文件>
dpkg -c <deb包文件>

附录: deb包的简单使用

sudo dpkg -i <deb包文件>	# 安装deb包
sudo dpkg -l			 # 显示已经安装的包
sudo dpkg -P <包名称>	  # 卸载指定的软件包

cpack的其他的参数说明:

参考cmake官网:https://cmake.org/cmake/help/latest/module/CPack.html

# 指定deb包的版本号
set(_VERSION_MAJOR 1)
set(_VERSION_MINOR 2)
set(_VERSION_PATCH 3)
set(CPACK_PACKAGE_VERSION_MAJOR "${_VERSION_MAJOR}")
set(CPACK_PACKAGE_VERSION_MINOR "${_VERSION_MINOR}")
set(CPACK_PACKAGE_VERSION_PATCH "${_VERSION_PATCH}")
# 指定程序名,就是程序安装后的名字
set(CPACK_DEBIAN_PACKAGE_NAME "mork_printer_project_demo")
# 指定运行的计算机架构
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "amd64")
# 指定所需的依赖
# set(CPACK_DEBIAN_PACKAGE_DEPENDS "libgrpc++")
# 设置包作者的联系方式
set(CPACK_PACKAGE_CONTACT "supporter@gmail.com")
# 设置维护人
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "members of support@gmail.cn")
# 指定需要安装的文件
INSTALL(TARGETS LinkLibraryDemo
        RUNTIME DESTINATION /tmp/cmake_demo
        #LIBRARY DESTINATION /tmp/cmake_demo    # 通常,编译器只会在 </usr/lib> 和 </lib> 中找头文件,如果
        #ARCHIVE DESTINATION /tmp/cmake_demo    # 将库文件放在其他目录,可能会引起找不到库文件错误
        )

此方法打包的优缺点:

优点:操作简单

缺点:如果打包的工程依赖了第三方库,则这些三方库需要以静态库(static)的形式链接到项目中去,否则,如果将deb包安装在另外一台不包含这些库的电脑上,可执行程序将无法运行。(或者可以在目标电脑上安装相应的库文件)

方法2 使用dpkg-deb

dpkg-deb命令是Debian Linux下的软件包管理工具,它可以对软件包执行打包和解包操作以及提供软件包信息。

下面举一个简单的例子, 一个c++工程add_num的目录结构如下(和上面的例子一样):

.
└── cmake
    ├── CMakeLists.txt
    ├── include
    │   └── add_num.h
    ├── README.md
    └── src
        ├── add_num.cpp
        └── main.cpp

每个文件的内容同上。

# 1.编译生成可执行文件
mkdir build && cd build
cmake ../ 
make -j4

# 2. 编写control文件
cd ../
mkdir DEBIAN
echo "Package: add_num
Version: 1.0
Section: custom
Priority: optional
Architecture: all
Essential: no
Installed-Size: 1024
Maintainer: linuxconfig.org
Description: Print linuxconfig.org on the screen" >DEBIAN/control
mkdir -p ./usr/bin
cp ./build/addnumapp ./usr/bin/
rm -rf build
cd ../
dpkg-deb --build add_num

此时在当前目录下会生成add_num.deb。

查看deb包信息, dpkg -I add_num.deb

new Debian package, version 2.0.
size 18838636 bytes: control archive=348 bytes.
    199 bytes,     9 lines      control              
Package: linuxconfig
Version: 1.0
Section: custom
Priority: optional
Architecture: all
Essential: no
Installed-Size: 1024
Maintainer: linuxconfig.org
Description: Print linuxconfig.org on the screen

dpkg -c add_num.deb:

drwxr-xr-x kfr/kfr           0 2020-10-29 18:11 ./
-rw-r--r-- kfr/kfr         278 2020-10-29 18:10 ./CMakeLists.txt
-rw-r--r-- kfr/kfr          41 2020-10-29 18:10 ./README.md
drwxr-xr-x kfr/kfr           0 2020-10-29 18:10 ./include/
-rw-r--r-- kfr/kfr          81 2020-10-29 18:10 ./include/add_num.h
drwxr-xr-x kfr/kfr           0 2020-10-29 18:10 ./src/
-rw-r--r-- kfr/kfr         111 2020-10-29 18:10 ./src/add_num.cpp
-rw-r--r-- kfr/kfr         177 2020-10-29 18:10 ./src/main.cpp
drwxr-xr-x kfr/kfr           0 2020-10-29 18:10 ./usr/
drwxr-xr-x kfr/kfr           0 2020-10-29 18:10 ./usr/bin/
-rwxr-xr-x kfr/kfr        9080 2020-10-29 18:10 ./usr/bin/addnumapp

此方法打包的优缺点:

优点:操作简单

缺点:如果打包的工程依赖了第三方库,则需要将依赖的第三方库和deb文件一起拷贝到目标电脑上,否则可执行文件找不到依赖库。

解决办法: 在DEBIAN文件夹同级目录下新建一个lib文件夹,将可执行程序依赖的动态库都拷贝到lib文件夹中去。

参考链接

Creating debian packages — CMake: https://blog.usejournal.com/creating-debian-packages-cmake-e519a0186e87

cpack官方教程:https://cmake.org/cmake/help/latest/module/CPack.html

dpkg-deb: https://linuxconfig.org/easy-way-to-create-a-debian-package-and-local-package-repository

dpkg命令大全:https://man.linuxde.net/dpkg

debmake使用:https://www.debian.org/doc/manuals/debmake-doc/apa.en.html
debian包介绍:https://wiki.debian.org/Packaging/Introaction=show&redirect=IntroDebianPackaging
cpack链接:https://cmake.org/cmake/help/latest/module/CPack.html
cpack使用介绍:https://zhuanlan.zhihu.com/p/141956373
cpack:https://juejin.im/post/6844903558551175175
cpack制作deb:https://blog.csdn.net/cedian0443/article/details/106456999/
Making a Debian Package: https://people.debian.org/~jaldhar/make_package1.html

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值