zoukankan      html  css  js  c++  java
  • 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
    1
    2
    3
    4
    5
    6
    7
    8
    9
    其中每个文件的内容如下:

    include/add_num.h:

    class A2DD
    {
    int gx;
    int gy;

    public:
    A2DD(int x,int y);
    int getSum();
    };
    1
    2
    3
    4
    5
    6
    7
    8
    9
    src/add_num.cpp

    #include "add_num.h"

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

    int A2DD::getSum()
    {
    return gx + gy;
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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;
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    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)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    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
    1
    2
    3
    4
    执行完上述命令以后,在build目录下生成了addnum-0.1.1-Linux.deb。

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

    dpkg-deb -I <deb包文件>
    dpkg -c <deb包文件>
    1
    2
    附录: deb包的简单使用

    sudo dpkg -i <deb包文件> # 安装deb包
    sudo dpkg -l # 显示已经安装的包
    sudo dpkg -P <包名称> # 卸载指定的软件包
    1
    2
    3
    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 # 将库文件放在其他目录,可能会引起找不到库文件错误
    )
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    此方法打包的优缺点:

    优点:操作简单

    缺点:如果打包的工程依赖了第三方库,则这些三方库需要以静态库(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
    2
    3
    4
    5
    6
    7
    8
    9
    每个文件的内容同上。

    # 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
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    此时在当前目录下会生成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
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    此方法打包的优缺点:

    优点:操作简单

    缺点:如果打包的工程依赖了第三方库,则需要将依赖的第三方库和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

  • 相关阅读:
    模板、中间件以及MVC与MTV
    Cookie与Session
    分页与网页攻击
    Django一对一查询,列类型及参数
    Django ORM 查询
    Django中ORM多对多表的操作
    Django中的ORM
    一、Vue简介
    三、路由层(urls.py)
    二、django简介
  • 原文地址:https://www.cnblogs.com/guxuanqing/p/15601273.html
Copyright © 2011-2022 走看看