12
回答
Linux下如何发布QT程序
华为云实践训练营,热门技术免费实践!>>>   
在LINUX下用QT写了一个程序,现在要放到没有装QT的linux系统电脑上运行,请问怎么发布QT程序?
谷歌了一些,没看懂,来这里找大侠们讲解一下。
请说的详细一点。
举报
zjb1025
发帖于4年前 12回/10K+阅
共有12个答案 最后回答: 3年前
谢谢,我现在知道这个问题所在了。

应该是将qt使用的库libQtGui.so.4.7.4和libQtCore.so.4.7.4一起拷贝过去,并使用命令:ln -s libQtGui.so.4.7.4 libQtGui.so.4
ln -s libQtCore.so.4.7.4 libQtCore.so.4.7.4
在进行配置动态库路径:export  LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
运行就可解决这个问题。

可以自帶用到Qt的*.so,不過只有固定路徑的自帶比較簡單,搞成任意路徑比較折騰

也可以打一個deb包指明你用到的Qt庫作為依賴。Debian打包分source打包和binary打包。所謂source打包我覺得基本不是給人用的(雖然Debian發行版的包都是source打包),binary打包就是用dpkg-deb命令,很簡單,不過沒有太像樣的文檔。你自己研究或者搜索網上信息加腦補。

--- 共有 2 条评论 ---
学习重要回复 @zjb1025 : control文件裡面加:http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-binarycontrolfiles 4年前 回复
zjb1025关键就是使用deb打包的话,怎样将需要使用的Qt库加入deb包中? 4年前 回复

静态编译整个Qt库,然后再用这个静态Qt库编译你的程序,最终你会得到一个不低于5M的可执行文件,就可以不需要任何额外的依赖包部署到其他机器上了

如果还看不懂请自行脑补

--- 共有 4 条评论 ---
汤医森回复 @学习重要 : 没看到,不过Qt的商业版授权不算贵了 4年前 回复
学习重要回复 @StarGate : 我說了「對於閉源軟件」 4年前 回复
汤医森回复 @学习重要 : 我记得LGPL协议允许软件源码开源的前提下静态编译,用于商业用途不允许开源库及调用部分静态编译 4年前 回复
学习重要靜態編譯對於閉源軟件有許可證問題啊...當然用Qt商業版的可以不用管... 4年前 回复
这个不行的,我试过了,不能跟win上一样,直接拷贝Dll库就可运行。
--- 共有 1 条评论 ---
学习重要這個是因爲Linux下編譯的程序默認不把當前目錄作爲*.so的搜索路徑,但是可以通過修改rpath的方式加入當前目錄(.) 4年前 回复

用 ldd 查看你的可执行文件依赖哪些库,全拷到同一目录下应该就行,总之缺什么拷什么

如果还找不到库再试下设定动态库路径:export  LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

ldd shuduFenxi 
        linux-gate.so.1 =>  (0x55577000)
        libQtGui.so.4 => /usr/lib/i386-linux-gnu/libQtGui.so.4 (0x555ac000)
        libpng12.so.0 => /lib/i386-linux-gnu/libpng12.so.0 (0x5607f000)
        libfreetype.so.6 => /usr/lib/i386-linux-gnu/libfreetype.so.6 (0x560a9000)
        libfontconfig.so.1 => /usr/lib/i386-linux-gnu/libfontconfig.so.1 (0x56143000)
        libQtCore.so.4 => /usr/lib/i386-linux-gnu/libQtCore.so.4 (0x56177000)
        libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0x56454000)
        libgthread-2.0.so.0 => /usr/lib/i386-linux-gnu/libgthread-2.0.so.0 (0x5646b000)
        libglib-2.0.so.0 => /lib/i386-linux-gnu/libglib-2.0.so.0 (0x5646e000)
        libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0x56567000)
        libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0x5656c000)
        libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0x56587000)
        libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0x5666d000)
        libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0x56699000)
        libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x566b7000)
        libaudio.so.2 => /usr/lib/i386-linux-gnu/libaudio.so.2 (0x56861000)
        libgobject-2.0.so.0 => /usr/lib/i386-linux-gnu/libgobject-2.0.so.0 (0x5687a000)
        libSM.so.6 => /usr/lib/i386-linux-gnu/libSM.so.6 (0x568ca000)
        libICE.so.6 => /usr/lib/i386-linux-gnu/libICE.so.6 (0x568d3000)
        libXi.so.6 => /usr/lib/i386-linux-gnu/libXi.so.6 (0x568ed000)
        libXrender.so.1 => /usr/lib/i386-linux-gnu/libXrender.so.1 (0x568fe000)
        libXext.so.6 => /usr/lib/i386-linux-gnu/libXext.so.6 (0x56908000)
        libX11.so.6 => /usr/lib/i386-linux-gnu/libX11.so.6 (0x5691b000)
        libexpat.so.1 => /lib/i386-linux-gnu/libexpat.so.1 (0x56a4f000)
        librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0x56a79000)
        /lib/ld-linux.so.2 (0x55555000)
        libpcre.so.3 => /lib/i386-linux-gnu/libpcre.so.3 (0x56a82000)
        libXt.so.6 => /usr/lib/i386-linux-gnu/libXt.so.6 (0x56abf000)
        libXau.so.6 => /usr/lib/i386-linux-gnu/libXau.so.6 (0x56b1b000)
        libffi.so.6 => /usr/lib/i386-linux-gnu/libffi.so.6 (0x56b1f000)
        libuuid.so.1 => /lib/i386-linux-gnu/libuuid.so.1 (0x56b26000)
        libxcb.so.1 => /usr/lib/i386-linux-gnu/libxcb.so.1 (0x56b2c000)
        libXdmcp.so.6 => /usr/lib/i386-linux-gnu/libXdmcp.so.6 (0x56b4e000)


--- 共有 1 条评论 ---
学习重要這樣的話需要一個包裝腳本... 4年前 回复

根据以往经验,一个Qt GUI程序大概依赖100M左右的qt so以及其他各种动态库,所以比较靠谱的就是做成rpm/deb包,将依赖关系告知用户要求其安装,或者比较丑一点,做成静态编译。静态编译是一种比较丑陋的做法,但是有些应用确实需要这样。譬如三年前我发布过一个联网认证程序,用户通常是在没有网络、只装了一个基本的Ubuntu/Fedora的情况下使用我的程序,这时候肯定不能要求用户去安装依赖包,只好做成静态编译的安装包

顶部