精华内容
下载资源
问答
  • linux qt 打包安装程序

    千次阅读 2017-03-22 15:28:13
    一、Linux下qt程序动态打包步骤:  1.从可运行程序的文件中拿出可执行文件;  2.终端下 使用ldd命令查看需要的连接库;  3.把ldd查询到的所有需要的库导出;  4.编写.sh文档,书写环境变量,或者在/etc/profile...

    一、Linux下qt程序动态打包步骤:

        1.从可运行程序的文件中拿出可执行文件;

        2.终端下 使用ldd命令查看需要的连接库;

        3.把ldd查询到的所有需要的库导出;

             提供一个脚本将ldd打印出来的依赖库复制到指定路径:

    #!/bin/sh  
      
    exe="test" #发布的程序名称  
    des="/home/hejianglin/QtProject/build-test-Desktop-Release/ReleaseTest" #你的路径  
      
    deplist=$(ldd $exe | awk  '{if (match($3,"/")){ printf("%s "),$3 } }')  
    cp $deplist $des 
    说明:exe :要发布的程序名称 des:指定复制的路径


        4.编写.sh文档,书写环境变量,或者在/etc/profile文件中书写环境变量:export $LD_LIBRARY_PATH=$LD_LIBRARY_PATH + 链接库目录,在运行source /etc/profile,重启电脑即可生效。

        #!/bin/sh  
        appname=`basename $0 | sed s,\.sh$,,`  
          
        dirname=`dirname $0`  
        tmp="${dirname#?}"  
          
        if [ "${dirname%$tmp}" != "/" ]; then  
        dirname=$PWD/$dirname  
        fi  
        LD_LIBRARY_PATH=$dirname  
        export LD_LIBRARY_PATH  
        $dirname/$appname "$@"  


        5.把所用到的库,可执行文件,.sh文件放到同一目录下;

        6.修改脚本权限,执行脚本,同时可以执行可执行程序。

         

          chmod +x test.sh



    二、在Linux的桌面上创建快捷方式或启动器

    一个桌面快捷方式是由内含该APP元信息(例如,app的名字,启动命令或者图标位置等)的.desktop文件所表示的。

    桌面快捷方式文件放置于/usr/share/applications或者~/.local/share/applications处。

    前一个目录存储的桌面快捷方式每个用户都可以使用,而后一个目录则含有仅仅为特定用户创建的快捷方式。

        方法1:利用右键创建启动器,来创建可执行程序的快捷方式

        方法2:利用创建.desktop创建桌面快捷方式

        一个典型的.desktop文件如下所示。

    [Desktop Entry]   
    
        Encoding=UTF-8 Version=1.0  
        Type=Application  
        Terminal=false  
        Icon[zh_CN]=gnome-panel-launcher  
        Name[zh_CN]=scada  
        Exec=/home/test/scada  
        Name=scada  
        Icon=gnome-panel-launcher 

     参考:http://blog.csdn.net/hjl_1991/article/details/50365927

    http://blog.csdn.net/u011822862/article/details/46816895?locationNum=4



    展开全文
  • Linux 程序打包

    千次阅读 2013-07-30 16:36:34
    最近有个项目需要把编译好的 Linux 程序打包安装到多种 Linux 发行版上执行。由于是不同的发行版,所以不适合使用各个发行版自己的软件包格式。即使针对特定发行版,还是会因为不同版本的系统库版本不同而无法创建...

    为 Linux 程序打包

    2012-09-14

    最近有个项目需要把编译好的 Linux 程序打包后安装到多种 Linux 发行版上执行。由于是不同的发行版,所以不适合使用各个发行版自己的软件包格式。即使针对特定发行版,还是会因为不同版本的系统库版本不同而无法创建通用的软件包。(程序既需要安装到 Fedora 6 这样“古老”的版本上,也需要安装到这两年发布的发行版上。)比较几种解决方案后最终选择了打包开发系统上的动态链接库,用脚本指定 dynamic linker 和动态链接库目录的方式来执行打包后二进制文件的方案。

    最先考虑的是静态链接,但开发用的 Ubuntu 并没有提供所有依赖库的静态链接版本。自己重新编译所有的库比较麻烦,所以没有用这个方案。

    LD_LIBRARY_PATH 和 dynamic linker

    之后尝试过 CDE (后面会具体介绍),由于一些限制最后还是决定自己打包,这样不依赖其他工具,可以获得完全的控制。最开始的时候以为只要简单的把程序依赖的动态链接库找出来全部放到一个目录下,在其他系统上指定 LD_LIBRARY_PATH 即可正常使用,但实际上这么做还差了一步。

    只指定 LD_LIBRARY_PATH 时遇到了两种错误:

    • 为了让编译得到的 binary 文件同时工作在 32/64-bit 的系统上,我在 32-bit Ubuntu 上编译。拷贝 binary 到 64-bit 的系统上执行时遇到了如下错误:

      /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory

    • 32-bit 的 Fedora 6 上在设置了 LD_LIBRARY_PATH 之后,执行任何程序都会段错误

    Google 之后发现 Stack Overflow 上也有人遇到过第二个问题。其实这两个错误的原因都跟 dynamic linker (dynamic linking loader) 有关。

    在使用 GNU C 库的系统上,运行 ELF 文件时会自动执行 dynamic linker (在 32-bit Linux 上一般是 /lib/ld-linux.so.2,64-bit 上是 /lib/ld-linux-x86-64.so.2),dynamic linker 会读取 LD_LIBRARY_PATH 然后在指定的目录下找 shared library。但 dynamic linker 自身的路径是硬编码在 ELF 文件头中的。

    所以 64-bit 系统上报的错误真正的含义是找不到 dynamic linker,因为该系统上并没有安装 32-bit 的 C 库。第二个错误应该是由于 Fedora 6 上的 dynamic linker 和我打包的 Ubuntu 的 C 库不兼容。(Stack Overflow 上的回答里说 loader 是 C 库的一部分,不过不兼容的具体原因不清楚。)

    解决这个问题的办法是指定程序启动使用的 loader,调用方式如下:

    LD_LIBRARY_PATH=<lib path> /lib/ld-linux.so.2 <executable>
    

    /lib/ld-linux.so.2 由于是 dynamic linker,所以支持这样的调用方式。但其实通过 LD_LIBRARY_PATH 环境变量来指定 library search path 有一个缺点:进程会带有这个环境变量。因此进程在尝试执行系统上的其他命令时可能遇到上述的第二个问题。事实上应该尽可能避免使用 LD_LIBRARY_PATH 这个环境变量,参考 Why LD_LIBRARY_PATH is bad

    好在 dynamic linker 可以使用参数来指定 library search path,如下:

    /lib/ld-linux.so.2 --library-path <lib path> <executable>
    

    给 dynamic linker 指定参数后就会忽略 LD_LIBRARY_PATH

    知道 dynamic linker 的问题之后,打包剩下的工作就是修改脚本来用 dynamic linker 启动可执行文件了。

    编译时指定 library path 和 dynamic linker

    如果发布的程序经常要在 shell 里交互使用,每次执行时指定 dynamic linker 还是会很不方便。实际上 dynamic linker 和 library path 信息都保存在 ELF header 中的,程序在链接时可以指定这些信息。

    library path 可以通过传递 --rpath=<path list> 参数给链接器来指定,dynamic loader 则是通过 --dynamic-linker=<path to loader> 来指定。如果是由 gcc 来调用 linker,可以通过 -Wl, 来把选项传递给 linker,如下:

    gcc ... -Wl,--rpath=<path list> -Wl,--dynamic-linker=<path to loader>
    

    可以使用 readelf -a <executable> 来查看得到的 ELF 文件头信息,其中 INTERP 指定的就是 dynamic linker,而 RPATH 就是 library search path。

    因为不想修改 configure 脚本,所以我最后没有采用这种方式。

    CDE

    其实 Linux 下打包程序的问题以前就有人尝试解决过。前段时间读了 Philip J. Guo 的 The Ph.D. Grind,他博士期间的一项工作 Code Data Environment (CDE) 就是用来为应用程序创建一个自包含的包,然后发布到其他 Linux 系统上去执行。扫过一眼 CDE 的论文,其最主要的工作机制是使用 ptrace 来拦截系统调用,从而捕获程序依赖的文件以及系统环境(例如环境变量)。简单起见只考虑程序依赖的文件,CDE 工作其原理如下:

    • 在创建包的时候,执行程序同时拦截 open 这样的系统调用来看应用程序使用到了哪些文件,拷贝或者链接到打包目录下
    • 在部署的系统上执行时,同样拦截 open 调用,然后将其尝试打开的文件用打包目录下的文件来替代

    这个原理简单有效,CDE 实际使用下来我觉得也非常方便,10 分钟内我就成功的把一台 Fedora 6 上的 vim 安装到另一台 Debian 6 上并且正常使用了。对某些需求来说,CDE 的确可以作为解决 Linux dependency hell 一个方便的工具。

    然而 CDE 打包后的程序是在 sandbox 中执行,不能访问 sandbox 之外的文件,除非使用 seamless execution mode。但要让 seamless execution mode 正常工作比较 tricky,CDE 对我来说毕竟是新工具,担心了解不够需要花太多时间 debug 所以最后没有采用。(CDE 执行应用程序时需要使用 ptrace 监控程序,对程序执行性能会有一点影响,不过影响不大,对我的应用来说性能不是主要问题。)

    Shared Library 相关资料

    Program Library HOWTO,这是一篇不错的介绍 shared library 的文章。这里是我做的一些笔记

     2012-09-14  linux


    展开全文
  • Linux下可以通过build生成windows下的可执行程序,并且在windows下可执行,而且在windows下通过Inno Setup打包生成可安装程序 那接下来就是调研怎么在Linux系统中生成可执行程序。 2.Linux下生成可执行程序 1...

    1.前言

    在上一篇博客中讲到交叉打包的问题,但是很遗憾的是,目前做不到。

    • 在window下打包的可执行程序,无法在Linux下执行,并且会出现core dumped的问题,目前无法解决
    • 在Linux下可以通过build生成windows下的可执行程序,并且在windows下可执行,而且在windows下通过Inno Setup打包生成可安装程序
    • 那接下来就是调研怎么在Linux系统中生成可执行程序。

    2.Linux下生成可执行程序

    2.1.准备工作

    因为VS code9(以下简称VS)开发工具就是使用electron开发的,所以就在官网看了一下安装VS的安装程序。

    的安装包,接下来就需要调研在Linux下怎么生成.deb安装包从上图可以看出在Linux系统下有两种安装包,也就是说后期为了支持不同的Linux系统,还需要生成不同的安装包,这个还待研究。由于我安装的Ubunt,所以就拿Ubunt来做实验。所以我是用的也是.deb格式以及怎么安装。

    • Ubunt,Debian系统中使用.deb格式的安装包
    • Red Hat,Fedora,SUSE系统下使用的.rpm安装包

    2.2.生成.deb文件

    2.2.1 创建文件夹

    可以在任意目录下创建新的文件夹,有人喜欢在usr目录下,我是在桌面创建了一个soft文件夹,然后把我的的项目按照不同的文件去划分。

    在soft文件下创建agentuser文件夹

    2.2.2 在agentuser下创建文件目录

    其目录结构如下:

    • DEBIAN:大写,用来进行制作打包文件
    • control:描述deb包的信息必须的文件
    • usr:用户安装文件一般会存到这个文件下,安装后的一些配置文件,可执行文件等可能会存放到usr下不同的目录下
    • share:共享文件夹
    • applications:应用的配置信息,Ubuntu启动时会找到applications下的.desktop文件将其加载到应用中

          

    • agentuser.desktop:桌面文件会生成到/usr/share/applications/,applications会根据文件中的配置将icon,bin等文件一起加载
    • icons:图标文件生成到/usr/share/icons/
    • icon.ico:图标文件
    • bin:这个是最重要的部分,存放可执行程序。由于我build之后的项目是一个文件夹,里面不单单存在可执行文件,还有其他依赖文件,所以需要都放到该目录下,可以直接将build/linuxxxx 文件下的内容copy到lib中

    2.2.3 定义control文件

    package: dynarose                                                            
    version: 1.0.0                                                                
    architecture:amd64                                                          
    maintainer: chenqingkun                                                       
    description: Dynarose agent client
    • pacakge:打包后的名称
    • version:版本后
    • architecture:系统

             关于版本可以查看自己系统的版本号,可以通过cat /proc/version查看,如果系统对不上,打包就会失败

             

     

    • maintainer:维护者/开发者
    • description:描述

    2.2.4 定义deb.desktop文件

    [Desktop Entry]
    Name=Dynarose
    Comment=Dynarose User example
    Exec=/usr/bin/dynarose
    Icon=/usr/share/icons/icon.png
    Terminal=false
    Type=Application
    X-Ubuntu-Touch=true
    Categories=Development

    2.2.5 打包deb包

    通过cd切换到mydeb同级目录,执行打包命令。

    sudo dpkg -b agentuser agentuser_1.deb
    

    查看目录中,确实生成了文件agentuser_1.deb

    2.2.6 安装deb文件

    执行命令

    sudo dpkg -i agentuser_1.deb

    由于是deb文件,所以也可以双击执行安装

    2.2.7 执行可执行文件

    切到usr/bin目录下可以看到生成了可执行文件dynarose*文件

     

    可以通过./dynarose执行文件,可以看到安装后的文件确实能正常执行。

    当然这种启动方式是不合理的,我们需要从应用中启动该应用。

    打开应用列表,可以查看到我们新安装的软件

    双击执行

    展开全文
  • Linux打包发布Qt应用程序

    万次阅读 多人点赞 2018-10-27 12:46:42
    Linux打包发布Qt应用程序Linux打包发布Qt应用程序1. 编译文件2.巧用脚本文件新建文件添加脚本执行脚本打包发布 Linux打包发布Qt应用程序 Linux下使用Qt进行开发的程序,如果想要在其他搭载Linux系统的主机上...

    Linux下打包发布Qt应用程序

    Linux下使用Qt进行开发的程序,如果想要在其他搭载Linux系统的主机上运行则需要将要发布的Qt程序依赖的一些动态链接库一起打包。具体做法如下:

    1. 编译文件

    在Qt中使用release的方式编译出可执行文件,然后新建一个文件夹,将可执行文件拷贝进去备用。

    2.巧用脚本文件

    这里以Server可执行文件为例。
    在新建的文件夹下,新建两个脚本文件:

    新建文件

    1. pack.sh
    2. Server.sh 这个脚本文件名必须和要发布的程序名字相同,所以为 Server
      新建文件后,文件夹包含内容如下:
      文件夹内容

    添加脚本

    pack.sh文件里添加以下内容:

    #!/bin/sh  
    exe="Server" #你需要发布的程序名称
    des="/home/mrzhong/server" #创建文件夹的位置
    deplist=$(ldd $exe | awk  '{if (match($3,"/")){ printf("%s "),$3 } }')  
    cp $deplist $des
    

    然后向Server.sh文件里添加以下内容(内容不需要更改):

    #!/bin/sh  
    appname=`basename $0 | sed s,\.sh$,,`  
    dirname=`dirname $0`  
    tmp="${dirname#?}"  
    if [ "${dirname%$tmp}" != "/" ]; then  
    dirname=$PWD/$dirname  
    fi  
    LD_LIBRARY_PATH=$dirname  
    export LD_LIBRARY_PATH  
    $dirname/$appname "$@"
    

    执行脚本

    终端进入文件夹目录,运行:

    ./pack.sh
    

    可执行文件依赖的链接库将会拷贝到所在的目录,如图:
    alt
    在其他主机里面使用和可执行文件同名的脚本文件(这里为Server.sh)运行程序即可。

    打包发布

    最后将这个文件打包后拷贝到其他主机上即可运行。

    展开全文
  • Qt5.8 linux程序打包发布

    千次阅读 2017-07-26 21:23:45
    为便于描述,我们这里假设生成的程序名称为test(即要发布的程序名称)1. QtCreate使用Release版本编译将编译后生成的可...使用ldd命令查看导出需要的库在步骤1的目录下新建一个pack.sh文件,文件内容如下:#!/bin/
  • linux程序打包发布

    千次阅读 2018-10-30 19:05:53
    程序以test为例: 1. QtCreate使用Release版本编译 2. 从可运行程序的文件中拿出可执行文件,例:test 3. 终端下使用ldd命令查看需要的连接库,例:ldd test 4. 把ldd查询到的所有需要的库导出 这里提供一个...
  • linux程序打包deb

    千次阅读 2018-02-07 10:12:35
    deb是Unix系统(其实主要是Linux)下的安装包,基于 tar 包,因此本身会记录文件的权限(读/写/可执行)以及所有者/用户组。 由于 Unix 类系统对权限、所有者、组的严格要求,而 deb 格式安装包又经常会涉及到系统比较...
  • 如题,近期因为项目需求,得打包QT程序,并将程序放到没有安装QT库的电脑上运行。网上索罗了下,打包QT程序的方式很多,主要分为以下几种:1. 打包成安装包形式;2. 打包成二进制文件,附带运行库的形式:- windows...
  • Qt程序在windows linux打包发布

    千次阅读 2015-07-09 14:49:43
    一、Linux下qt程序动态打包步骤:  1.从可运行程序的文件中拿出可执行文件;  2.终端下 使用ldd命令查看需要的连接库;  3.把ldd查询到的所有需要的库导出;  4.编写.sh文档,书写环境变量,或者在/etc/...
  • linux环境打包python工程为可执行程序

    万次阅读 2019-03-14 15:36:21
    本次又个需求,在ubuntu上面开发的python代码程序需要打包成一个可执行程序然后交付给甲方,因为不能直接给源码给甲方,所以寻找方法将python开发的源码打包成一个可执行程序,注意是打包成在ubuntu上面的可执行程序...
  • Linux下QT程序打包发布

    千次阅读 2018-03-21 10:22:06
    程序以test为例:1. QtCreate使用Release版本编译2. 从可运行程序的文件中拿出可执行文件,例:test3. 终端下使用ldd命令查看需要的连接库,例:ldd test4. 把ldd查询到的所有需要的库导出这里提供一个脚本loadlib.sh ...
  • linux Qt程序打包(linuxdeployqt工具的使用)官方提供的最新版本基于Qt5.8的,用户可根据需要从源码编译成本机版本来使用,具体操作过程如下:工具1.linuxdeployqt 依赖工具: patchelf(必须) appimagetool(可选) 2....
  • windows和linux打包python程序

    千次阅读 2014-04-10 11:33:42
    1、py2exe是一种python发布工具,可以把python脚本转换成windows下的可执行程序,不需要安装python便可运行
  • 目录Linux下的QT程序打包,发布流程打包流程编译碰到的问题 ...问题描述:QT下运行的程序需要安装QT环境,为了让程序离开QT环境依旧可以照常运行,所以需要将程序打包发布。 打包流程 编译 碰到的问题 ...
  • linux打包上线程序

    千次阅读 2018-10-25 19:42:32
    安装jdk 1.查询原有的jdk rpm -qa | grep jdk rpm -qa | grep gcj yum -y remove 查询到的jdk 不行的话,用 rpm -e –nodeps 然后安装jdk8 yum list|grep java yum install java-1.8.0-openjdk.i...
  • Linux系统中打包发布Qt程序

    千次阅读 2019-01-22 11:17:51
    Linux系统下可以手写一个脚本文件,充分利用ldd命令进行打包。 实现 废话不说,步骤如下: QtCreator使用Release版本进行编译,并将编译后生成的可执行程序(MyApp)复制到一个空目录下。 在这个空目录下新建一个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 148,184
精华内容 59,273
关键字:

linux程序打包和安装

linux 订阅