1 minute read

1 Linux

1.1 脚本拷贝1

不建议用此方法,因为拷贝的库会和系统环境冲突,导致程序无法启动


图1:依赖库冲突

原理是通过 ldd 递归找到程序的依赖库,然后拷贝过来;所以需要事先配置好依赖环境;
具体代码

1.2 linuxdeployqt2

ubuntu 16.04 亲测可用;ubuntu 16 发布到 ubuntu 14 也可用,不过需额外拷贝三个库过来,libz.solibstdc++.solibfreetype.so

安装 linuxdeployqt

下载 linuxdeployqt-6-x86_64.AppImage

chmod 555 linuxdeployqt-6-x86_64.AppImage
mv linuxdeployqt-6-x86_64.AppImage /usr/local/bin/linuxdeployqt
linuxdeployqt -version # 验证安装是否成功(会输出版本信息)

配置 QT 环境变量

/etc/profile~/.bashrc 中加入下面代码:

#QT
# 版本号改成自己的,务必用绝对路径; ~ 代替 /home/XXX 将不会生效
export PATH=/home/XXX/Qt5.12.3/5.12.3/gcc_64/bin:$PATH
export LD_LIBRARY_PATH=/home/XXX/Qt5.12.3/5.12.3/gcc_64/lib:$LD_LIBRARY_PATH
export QT_PLUGIN_PATH=/home/XXX/Qt5.13.2/5.13.2/gcc_64/plugins:$QT_PLUGIN_PATH
export QML2_IMPORT_PATH=/home/XXX/Qt5.13.2/5.13.2/gcc_64/qml:$QML2_IMPORT_PATH
export LD_LIBRARY_PATH=/home/XXX/Qt5.12.3/5.12.3/gcc_64/plugins/platforms:$LD_LIBRARY_PATH

使用 source ~/.bashrcsource /etc/profile 使配置生效;

发布

linuxdeployqt AppName -appimage

修改 default.desktop 文件

要在终端执行相关命令,文件窗口下看不到该文件;

mv default.desktop AppName.desktop
删除 default.png,并放置一张图片,命名为 logo.png
编辑 AppName.desktop:

Version=1.0
Type=Application
Name=AppName
Exec=AppName
Icon=logo
Comment=This is a simple program
Terminal=false
Categories=Development;

记得删除里边的额[Desktop Entry]

发布

linuxdeployqt AppName -appimage 会生成一个以 .AppImage 结尾的文件,双击可执行;

Tips

  • 如果运行过程中提示缺少某些库,可使用 locate 命令定位其位置,然后拷贝至 lib 中即可;
  • 全程注意环境变量的配置,少库都是环境变量没配置全;
  • 执行时不会搜索当前文件夹,也不会递归搜索;因此需扫描的目录全部配置到环境变量中;

2 Windows

3 MacOS


TOP

附录

A 示例代码

1. 拷贝依赖库
新建文件 copy.sh

#!/bin/bash
# ./copy.sh app release

QtPlateform=/home/XXX/Qt5.12.3/5.12.3/gcc_64/plugins/platforms
QT=/home/XXX/Qt5.12.3/5.12.3/gcc_64/lib
export LD_LIBRARY_PATH=$QT:$QtPlateform:$LD_LIBRARY_PATH
echo $LD_LIBRARY_PATH

function cplib
{
    Target=$1
    dstDir=$2
    #$(ldd $exe | awk  '{if (match($3,"/")){ printf("%s "),$3 } }')
    lib_array=($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*"))
    $(mkdir $dstDir)
    for Variable in ${lib_array[@]}
    do
        cp "$Variable" $dstDir
    done
}

# 拷贝库
mkdir $2
libDir=$2"/lib"
plateformDir=$libDir"/platform"
appname=$1
cplib $appname $libDir
cp -r -d $QtPlateform $libDir
cplib $QtPlateform"/libqxcb.so" $libDir
cp $appname $2

# 创建可执行脚本
file=$appname.sh
echo 'export LD_LIBRARY_PATH=$PWD"/lib:"$PWD"/lib/platforms:"' | tee $file
echo ./$appname | tee -a $file
mv $file $2

B 参考资料

Comments