linux 下Qt WebEngine 程序打包简单记录
2017-01-05 16:45
253 查看
本次记录仅作参考。
其中
Qt官方文档中关于Qt在X11下的依赖情况 http://doc.qt.io/qt-5/linux-requirements.html
这个错误是因为Qt库的原因,这里可以现看一下生成程序的最后一步
链接中有
因为这里我们要打包,所以这里也不能直接使用绝对路径。而
其实Qt的很多文件都需要带上,这里就不啰嗦了。直接拷贝过来,要拷贝的内容如下。(使用cp命令的时候带上
拷贝之后,使用下面的命令来重新链接生成程序
注意,这里将原本的绝对路径改为了相对路径。
然后进入将
然后在当前
然后在当前
再运行就没有Qt库相关的问题了。
这是因为不能正确读取VLC插件的原因。通过
在最后链接的时候
现把
重新链接一下
再次编译运行,没有问题了。但是考虑到别的机器可能没有安装
这个问题是在给Virtual Box虚拟机中系统安装了增强功能之后出现的,原本程序会链接到
对于这个问题,直接关闭虚拟机的
http://www.cnblogs.com/oloroso/p/6149000.html
程序说明:
程序是一个编解码器控制管理的工具,使用到的库有:Qt的WebEngine、
OpenGL模块、
poco库、
libmicrohttpd、
libcurl、
libvlc。同时程序间接的依赖libssl/libxml2等库。
其中
poco/
libcurl/
libmicrohttpd等都编译为了静态库,
libvlc/
Qt库都是动态库。这里主要解决动态库的问题。
Qt官方文档中关于Qt在X11下的依赖情况 http://doc.qt.io/qt-5/linux-requirements.html
打包过程:
首先在QtCreator中编译运行程序,没有问题。 重新手动使用`qmake`生成`Makefile`编译后,运行程序出错。
错误及解决:
错误1:
/home/x/program/qt-5.6.0/5.6/gcc_64/libexec/QtWebEngineProcess: error while loading shared libraries: libQt5WebEngineCore.so.5: cannot open shared object file: No such file or directory
这个错误是因为Qt库的原因,这里可以现看一下生成程序的最后一步
链接的相关信息
g++ -Wl,-O1 -Wl,-z,origin -Wl,-rpath,\$ORIGIN -Wl,-rpath,/home/x/program/qt-5.6.0/5.6/gcc_64/lib -Wl,-rpath-link,/home/x/program/qt-5.6.0/5.6/gcc_64/lib -o WebCS main.o widget.o ActiveTasks.o Business.o CommonUtil.o JsonConfig.o NMUDPServer.o SocketUtil.o TCPLongConnection.o TCPServer.o UDPLongConnection.o UDPServer.o CharsetConvert.o CharsetConvertMFC.o CharsetConvertSTD.o FileAnywhereManager.o FileAnywhereObserver.o FileAnywhereTaskParameter.o InterfaceProcessTask.o InterfaceProtocolSpecific.o InterfaceServer.o UUID.o CBusinessEvent.o MircoHttpdInit.o VlcPlayer.o moc_widget.o moc_VlcPlayer.o -L/home/x/work/work/WebCS/Depends/libs -lmicrohttpd -lcurl -lNCX -lTaskModel -lPocoNet -lPocoJSON -lPocoXML -lPocoUtil -lPocoFoundation -lz -luuid -L/home/x/work/vlc-build/lib/ -lvlc -lvlccore -lssl -lcrypto -L/home/x/program/qt-5.6.0/5.6/gcc_64/lib -lQt5WebEngineWidgets -lQt5WebEngineCore -lQt5Quick -lQt5Widgets -lQt5Gui -lQt5Qml -lQt5Network -lQt5WebChannel -lQt5Core -lGL -lpthread
链接中有
-Wl,-rpath,\$ORIGIN -Wl,-rpath,/home/x/program/qt-5.6.0/5.6/gcc_64/lib -Wl,-rpath-link,/home/x/program/qt-5.6.0/5.6/gcc_64/lib指定了Qt库文件的路径,已经运行时候的查找路径。
-rpath-link:这个也是用于“链接”的时候的,例如你显示指定的需要 FOO.so,但是 FOO.so 本身是需要 BAR.so 的,后者你并没有指定,而是 FOO.so 引用到它,这个时候,会先从 -rpath-link 给的路径里找。 -rpath: “运行”的时候,去找的目录。运行的时候,要找 .so 文件,会从这个选项里指定的地方去找。对于交叉编译,交叉编译链接器需已经配置 --with-sysroot 选项才能起作用。也就是说,-rpath指定的路径会被记录在生成的可执行程序中,用于运行时查找需要加载的动态库。-rpath-link 则只用于链接时查找。
因为这里我们要打包,所以这里也不能直接使用绝对路径。而
QtWebEngineProcess这个程序是程序运行时候加载运行的,所以这个程序也要带上。
其实Qt的很多文件都需要带上,这里就不啰嗦了。直接拷贝过来,要拷贝的内容如下。(使用cp命令的时候带上
-d选项,避免跟踪符号链接)
[x@localhost build]$ cd /home/x/program/qt-5.6.0/5.6/gcc_64/ [x@localhost gcc_64]$ ls -p bin/ include/ libexec/ phrasebooks/ qml/ .tag doc/ lib/ mkspecs/ plugins/ resources/ translations/ [x@localhost gcc_64]$ cp -d -R lib libexec phrasebooks plugins resources translations ~/work/work/WebCS/build/ # ~/work/work/WebCS/build/ 是我程序的编译生成目录 # plugins resources translations 这几个都需要,不然WebEngine运行不起来
拷贝之后,使用下面的命令来重新链接生成程序
[x@localhost build]$ g++ -Wl,-O1 -Wl,-z,origin -Wl,-rpath,\$ORIGIN -Wl,-rpath,./lib -Wl,-rpath-link,./lib -o WebCS main.o widget.o ActiveTasks.o Business.o CommonUtil.o JsonConfig.o NMUDPServer.o SocketUtil.o TCPLongConnection.o TCPServer.o UDPLongConnection.o UDPServer.o CharsetConvert.o CharsetConvertMFC.o CharsetConvertSTD.o FileAnywhereManager.o FileAnywhereObserver.o FileAnywhereTaskParameter.o InterfaceProcessTask.o InterfaceProtocolSpecific.o InterfaceServer.o UUID.o CBusinessEvent.o MircoHttpdInit.o VlcPlayer.o moc_widget.o moc_VlcPlayer.o -L/home/x/work/work/WebCS/Depends/libs -lmicrohttpd -lcurl -lNCX -lTaskModel -lPocoNet -lPocoJSON -lPocoXML -lPocoUtil -lPocoFoundation -lz -luuid -L/home/x/work/vlc-build/lib/ -lvlc -lvlccore -lssl -lcrypto -L./lib -lQt5WebEngineWidgets -lQt5WebEngineCore -lQt5Quick -lQt5Widgets -lQt5Gui -lQt5Qml -lQt5Network -lQt5WebChannel -lQt5Core -lGL -lpthread
注意,这里将原本的绝对路径改为了相对路径。
然后进入将
lib目录下的文件都创建软链接到
libexec目录。
# 进入lib目录 [x@localhost build]$ cd lib # 删除多余的文件(这些是不需要的,还有一些没有用上的Qt模块也可以删掉) [x@localhost lib]$ rm *.la *.prl # 创建软连接 [x@localhost lib]$ ls *.so|xargs -I{} ln -s ../lib/{} ../libexec/{} [x@localhost lib]$ ls *.so|xargs -I{} ln -s ../lib/{} ../libexec/{}.5 [x@localhost lib]$ ls *.so|xargs -I{} ln -s ../lib/{} ../libexec/{}.5.6 [x@localhost lib]$ ls *.so|xargs -I{} ln -s ../lib/{} ../libexec/{}.5.6.0 # libcui的库,也要创建软链接 [x@localhost lib]$ ls *.so.56*|xargs -I{} ln -s ../lib/{} ../libexec/{} # 上面五条命令其实可以直接使用 ls *.so*|xargs -I{} ln -s ../lib/{} ../libexec/{} 来实现
然后在当前
build/libexec目录下新建
qt.conf文件,内容如下
[Paths] Prefix=..
然后在当前
build目录下新建
qt.conf文件,内容如下
[Paths] Prefix=.
再运行就没有Qt库相关的问题了。
错误2:
core libvlc error: No plugins found! Check your VLC installation.
这是因为不能正确读取VLC插件的原因。通过
strace命令跟踪运行程序,可以找到其去读取的位置(搜索输出语句,往上一点找),会发现它会在当前
build目录中查找,而实际上是这些插件是在
vlc编译安装目录/lib/vlc目录下。
在最后链接的时候
-L/home/x/work/vlc-build/lib/这一句只是指定了链接
libvlc``libvlccore的目录,所以这里做一点小的修改。
现把
libvlc中需要的相关文件都拷贝到
build目录下。
[x@localhost build]$ cp /home/x/work/vlc-build/lib/* lib/ -R
重新链接一下
[x@localhost build]$ g++ -Wl,-O1 -Wl,-z,origin -Wl,-rpath,\$ORIGIN -Wl,-rpath,./lib -Wl,-rpath-link,./lib -o WebCS main.o widget.o ActiveTasks.o Business.o CommonUtil.o JsonConfig.o NMUDPServer.o SocketUtil.o TCPLongConnection.o TCPServer.o UDPLongConnection.o UDPServer.o CharsetConvert.o CharsetConvertMFC.o CharsetConvertSTD.o FileAnywhereManager.o FileAnywhereObserver.o FileAnywhereTaskParameter.o InterfaceProcessTask.o InterfaceProtocolSpecific.o InterfaceServer.o UUID.o CBusinessEvent.o MircoHttpdInit.o VlcPlayer.o moc_widget.o moc_VlcPlayer.o -L/home/x/work/work/WebCS/Depends/libs -lmicrohttpd -lcurl -lNCX -lTaskModel -lPocoNet -lPocoJSON -lPocoXML -lPocoUtil -lPocoFoundation -lz -luuid -L./lib -lvlc -lvlccore -lssl -lcrypto -L./lib -lQt5WebEngineWidgets -lQt5WebEngineCore -lQt5Quick -lQt5Widgets -lQt5Gui -lQt5Qml -lQt5Network -lQt5WebChannel -lQt5Core -lGL -lpthread
再次编译运行,没有问题了。但是考虑到别的机器可能没有安装
openssl、
libuuid、
zlib等,所以这里需要使用
ldd看一下程序还有那些依赖的动态库是没有打包进来的,除了
libc.so.*等这种基础的库,都可以拷贝到
build/lib目录下。
错误3:
报了一个OpenGL函数没有实现的错误。OpenGL Warning: glXCreatePbuffer not implemented by Chromium OpenGL Warning: glXCreatePbuffer not implemented by Chromium OpenGL Warning: glXCreatePbuffer not implemented by Chromium OpenGL Warning: glXCreatePbuffer not implemented by Chromium js: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check http://xhr.spec.whatwg.org/. OpenGL Warning: glXCreatePbuffer not implemented by Chromium QOpenGLFramebufferObject: Unsupported framebuffer format. QOpenGLFramebufferObject: Unsupported framebuffer format.
这个问题是在给Virtual Box虚拟机中系统安装了增强功能之后出现的,原本程序会链接到
libGL.so*,现在会链接到
VBoxOGLcrutil.so。
对于这个问题,直接关闭虚拟机的
启用3D加速就可以了。
http://www.cnblogs.com/oloroso/p/6149000.html
相关文章推荐
- linux 下Qt WebEngine 程序打包简单记录
- qt添加cef库嵌入web,linux 下Qt WebEngine 程序打包简单记录
- linux 下Qt WebEngine 程序打包简单记录
- 第一次使用linux并编写了一个dump mysql的程序,记录下简单的步骤
- java学习2:记录如何简单的将idea编写的程序打包并转为exe格式
- 学习笔记:linux下java 程序打包成jar简单hello world
- Linux打包免安装的Qt程序
- 一次Linux 手持设备上手指滑动窗体的GTK程序的优化记录
- Linux下Qt程序的打包发布
- Linux上简单的meego开发QT程序
- Linux下两个程序进行socket通信的简单例子
- qt打包程序(简单)
- Linux进程程序替换以及简单的shell
- Linux内核分析二:一个简单的时间片轮转多道程序内核代码
- linux简单的TCP与UDP的socket程序以及机器大小端的判断程序
- 学会四招让你在linux下安装程序变得简单
- linux下基于tcp的简单的接收与发送程序,开发板与本机接收与发送信息
- 简单的Linux环境下多线程TCP服务程序框架
- linux+Qt程序如何打包发布
- 简单LinuxC程序关于倒置句子中的单词位置(指针的使用)