本次记录仅作参考。

程序说明:

程序是一个编解码器控制管理的工具,使用到的库有:Qt的WebEngineOpenGL模块、poco库、libmicrohttpdlibcurllibvlc。同时程序间接的依赖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

再次编译运行,没有问题了。但是考虑到别的机器可能没有安装openssllibuuidzlib等,所以这里需要使用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加速就可以了。

linux 下Qt WebEngine 程序打包简单记录的更多相关文章

  1. qt添加cef库嵌入web,linux 下Qt WebEngine 程序打包简单记录

    http://www.cnblogs.com/oloroso/p/6051631.html http://www.cnblogs.com/oloroso/p/6149000.html

  2. Linux下Qt应用程序的发布(使用LDD命令查看所有依赖的库文件)

    最近一直在学习Qt,用Qt写了一个程序,但是不知道怎么发布,网上说的都是在windows下怎么发布Qt应用程序,但是,在windows下Qt应用程序依赖的库文件与linux下的名字不同.于是,我就想到 ...

  3. Linux下搭建tomcat集群全记录

    (转) Linux下搭建tomcat集群全记录 2011-10-12 10:23 6133人阅读 评论(1) 收藏 举报 tomcatlinuxapacheinterceptorsession集群 1 ...

  4. Linux下Qt的安装与配置

    参考资料:http://www.cnblogs.com/emouse/archive/2013/01/28/2880142.html Linux 下编译.安装.配置 QT 下载qt 这里用的是4.7. ...

  5. Linux下的GitHub安装与简单配置教程 ~ 转载

    Linux下的GitHub安装与简单配置教程   1.GitHub简介 Git是一个分布式版本控制系统,与其相对的是CVS.SVN等集中式的版本控制系统. 2.Git的安装 1)安装Git a.查看与 ...

  6. Linux下的应用程序开机自启动

    Linux下的应用程序开机自启动,目前我知道的有2种: 1.将启动语句写到/etc/rc.local 2.在init.d放置启动脚本 第一种,很简单,直接写进去就行,比如说: /db/mongodb/ ...

  7. 如何使用加多宝(jdb)在linux下调试Java程序

    毕业时写了一段时间的C,那时候调试使用gdb,后来转了java,当时就想java程序怎么调试,找了一下,果然,那就是jdk自带的jdb windows里是这样的 Linux下是这样的 一般我在linu ...

  8. Linux下的 sniff-andthen-spoof程序编写

    Linux下的 sniff-andthen-spoof程序编写 一.任务描述 在本任务中,您将结合嗅探和欺骗技术来实现以下嗅探然后欺骗程序.你需要两台机器在同一个局域网.从机器A ping IP_X, ...

  9. linux下history命令显示历史指令记录的使用方法

    Linux系统当你在shell(控制台)中输入并执行命令时,shell会自动把你的命令记录到历史列表中,一般保存在用户目录下的.bash_history文件中.默认保存1000条,你也可以更改这个值 ...

随机推荐

  1. 【ios开发】UITableViewCell的重用

    移动开发需要解决的一个问题就是资源稀缺的问题.多数情况下是内存问题. 虽然现在的手机都号称大内存,高配置.但是移动app所占用的资源也在跟着不断膨胀, 也是造成内存不足的主要原因. 在前面的例子中,还 ...

  2. read properties

    读取配置文件在项目中使用频率很大,但是实际项目中各种人,各种用法,五花八门,往往是一种方式的各种变体,然很多种方式是其中一种方式的复杂化.今天我来总结下读取配置文件的集中方式及一些不能靠copy代码能 ...

  3. iOS中使用正则

    一.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式 ...

  4. 【BZOJ 2595】【WC 2008】游览计划

    http://www.lydsy.com/JudgeOnline/problem.php?id=2595 斯坦纳树的例题诶...我怎么做了好长时间_(:з」∠)_ 首先这是一棵树. 状压表示状态,\( ...

  5. 基于Visual Studio Code搭建Golang开发调试环境【非转载】

    由于对Docker+kubernetes的使用及持续关注,要理解这个平台的原理,势必需要对golang有一定的理解,基于此开始利用业余时间学习go,基础语法看完之后,搭建开发环境肯定是第一步,虽然能g ...

  6. [教程]phpwind9.0应用开发基础教程

    这篇文章着重于介绍在9.0中如何开发一个插件应用的示例,step by step来了解下在9.0中一个基础的应用包是如何开发的.1.目录结构OK,首先是目录结构,下面是一个应用我们推荐的目录. 应用包 ...

  7. Servlet-Cookie源码分析 源码环境:Tomcat8

    最近在学习servlet的一些实现细节,阅读了Cookie的源码. Cookie本质上是服务器发送给客户端(主要是浏览器)的一个会话临时数据. 其源码注释文档的说明: Creates a cookie ...

  8. Mysql多表表关联查询 inner Join left join right join

    Mysql多表表关联查询 inner Join left join right join

  9. input placeholder属性 样式修改(颜色,大小,位置)

    placeholder属性 样式修改 <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...

  10. iOS 安装应用

    1.itool 安装 不是本文重点 2.fruitstrap安装 2.1 前往 https://github.com/ghughes/fruitstrap 下载源代码 (git clone 即可) 2 ...