linux脚本打包复制,Linux打包免安装的Qt程序(编写导出依赖包的脚本copylib.sh,程序启动脚本MyApp.sh)...

本文介绍如何打包Qt程序,使其在没有安装Qt的系统可以运行。

默认前提:另外一个系统和本系统是同一个系统版本。

1,编写导出依赖包的脚本copylib.sh

#!/bin/bash

LibDir=$PWD"/lib"

Target=$1

lib_array=($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*"))

$(mkdir $LibDir)

for Variable in ${lib_array[@]}

do

cp "$Variable" $LibDir

done

1

2

3

4

5

6

7

8

9

10

11

12

13

14

更改可执行权限

chmod u+x copylib.sh

1

2

2,打开终端并进入到存放程序的(假设叫MyRelease)文件夹,运行下面命令(假设程序叫MyApp)

./copylib.sh MyApp

1

2

在此目录下会自动生成lib文件夹,脚本实际上是调用了 ldd MyApp指令获得MyApp运行时需要哪些库,并将库都复制放到当前目录的lib文件夹中。

3、把lib里的所有文件剪切到 MyRelease目录下,并删除此lib文件夹。

4、进入QT的安装目录,找到platforms文件夹,本文路径是

/opt/Qt5.3.1/5.3/gcc_64/plugins/platforms/

1

2

将整个platforms文件夹复制到MyRelease文件夹中,注意:这时复制的是整个文件夹,这使得MyRelease文件夹中会多出一个platforms文件夹。

5、将上文的copylib.sh放到MyRelease/platforms/中,并运行

./copylib.sh libqxcb.so

1

2

这时在当前目录会得到新的lib文件夹。

将lib里的所有文件剪切到 MyRelease目录下,并删除此lib文件夹

6、在MyRelease文件夹中新建程序启动脚本MyApp.sh(脚本名称和App名称相同)

#!/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 "$@"

1

2

3

4

5

6

7

8

9

10

11

12

13

更改可执行权限

chmod u+x MyApp.sh

1

2

7、测试程序

修改Qt的安装路径名称,如 /opt/Qt5.3.1/5.3 修改为 /opt/Qt5.3.1/5.311,

修改后,运行程序时就不能找到安装目录里的库文件了。

sudo mv /opt/Qt5.3.1/5.3/ /opt/Qt5.3.1/5.311

1

2

这样就可在本机上做测试了。

在MyRelease文件夹下运行

./MyApp.sh

1

2

可能会报错:

This application failed to start because it could not find or load the Qt platform plugin "xcb".

Available platform plugins are: xcb.

Reinstalling the application may fix this problem.

1

2

3

4

5

6

解决办法:

如果你修改了Qt安装路径名称,现在先修改回来,如:

sudo mv /opt/Qt5.3.1/5.311 /opt/Qt5.3.1/5.3

1

2

在MyRelease文件夹发现存在了一个libQt5DBus.so.5库文件,但他只是一个符号链接,需要把它补全。

[user@localhost]$ locate libQt5DBus

/opt/Qt5.3.1/5.3/gcc_64/lib/libQt5DBus.la

/opt/Qt5.3.1/5.3/gcc_64/lib/libQt5DBus.prl

/opt/Qt5.3.1/5.3/gcc_64/lib/libQt5DBus.so

/opt/Qt5.3.1/5.3/gcc_64/lib/libQt5DBus.so.5

/opt/Qt5.3.1/5.3/gcc_64/lib/libQt5DBus.so.5.3

/opt/Qt5.3.1/5.3/gcc_64/lib/libQt5DBus.so.5.3.1

...

1

2

3

4

5

6

7

8

9

把这两个库文件

/opt/Qt5.3.1/5.3/gcc_64/lib/libQt5DBus.so.5.3

/opt/Qt5.3.1/5.3/gcc_64/lib/libQt5DBus.so.5.3.1

1

2

3

拷贝到MyRelease文件夹下,然后再次运行启动脚本。

先修改路径(用以本地测试)

sudo mv /opt/Qt5.3.1/5.3/ /opt/Qt5.3.1/5.311

1

2

运行启动脚本

./MyApp.sh

1

2

OK,程序启动成功。

现在可以把MyRelease打包成压缩包,拷贝到其他系统上去运行了。

友情提示,测试完毕,如果修改了Qt安装路径,不要忘记再修改回来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个可以打包Qt可执行程序并拷贝依赖库的脚本,同时支持x86和arm架构: ``` #!/bin/bash # 设置目标平台和架构 ARCH=$1 if [ "$ARCH" != "x86" ] && [ "$ARCH" != "arm" ]; then echo "Invalid architecture. Please choose x86 or arm." exit 1 fi # 设置Qt的路径和版本号 QT_PATH=/opt/Qt/5.15.2 QT_VERSION=5.15.2 # 设置项目名称和路径 PROJECT_NAME=MyApp PROJECT_DIR=/path/to/project # 设置编译选项 QMAKE_CXXFLAGS="-fPIC -std=c++11" QMAKE_LFLAGS="-static-libgcc -static-libstdc++ -Wl,-rpath-link,'$$ORIGIN'" # 创建构建目录 BUILD_DIR=$PROJECT_DIR/build-$ARCH if [ ! -d "$BUILD_DIR" ]; then mkdir "$BUILD_DIR" fi # 生成Makefile cd "$BUILD_DIR" if [ "$ARCH" = "x86" ]; then $QT_PATH/$QT_VERSION/gcc_64/bin/qmake "$PROJECT_DIR/$PROJECT_NAME.pro" -spec linux-g++-64 else $QT_PATH/$QT_VERSION/android_armv7/bin/qmake "$PROJECT_DIR/$PROJECT_NAME.pro" -spec android-g++ "CONFIG+=arm" fi # 编译可执行程序 make if [ $? -ne 0 ]; then echo "Build failed." exit 1 fi # 拷贝依赖库 if [ "$ARCH" = "x86" ]; then # 拷贝Qt库 cp $QT_PATH/$QT_VERSION/gcc_64/lib/libQt5Core.so.5 $BUILD_DIR cp $QT_PATH/$QT_VERSION/gcc_64/lib/libQt5Gui.so.5 $BUILD_DIR cp $QT_PATH/$QT_VERSION/gcc_64/lib/libQt5Widgets.so.5 $BUILD_DIR cp $QT_PATH/$QT_VERSION/gcc_64/lib/libQt5Network.so.5 $BUILD_DIR else # 拷贝Qt库 cp $QT_PATH/$QT_VERSION/android_armv7/lib/libQt5Core.so.5 $BUILD_DIR cp $QT_PATH/$QT_VERSION/android_armv7/lib/libQt5Gui.so.5 $BUILD_DIR cp $QT_PATH/$QT_VERSION/android_armv7/lib/libQt5Widgets.so.5 $BUILD_DIR cp $QT_PATH/$QT_VERSION/android_armv7/lib/libQt5Network.so.5 $BUILD_DIR # 拷贝Android依赖库 cp $QT_PATH/$QT_VERSION/android_armv7/plugins/platforms/libqtforandroid.so $BUILD_DIR cp $QT_PATH/$QT_VERSION/android_armv7/plugins/bearer/libqandroidbearer.so $BUILD_DIR fi # 拷贝可执行程序 cp "$BUILD_DIR/$PROJECT_NAME" "$PROJECT_DIR" echo "Build successful." exit 0 ``` 在脚本中,您需要设置以下参数: - ARCH:目标平台和架构,可以选择x86或者arm。 - QT_PATH:Qt安装路径。 - QT_VERSION:Qt的版本号。 - PROJECT_NAME:项目名称。 - PROJECT_DIR:项目路径。 - QMAKE_CXXFLAGS:编译选项。 - QMAKE_LFLAGS:链接选项。 脚本执行完毕后,可执行程序依赖库会被拷贝到项目路径下。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值