zoukankan      html  css  js  c++  java
  • linux 下Qt WebEngine 程序打包简单记录

    本次记录仅作参考。

    程序说明:

    程序是一个编解码器控制管理的工具,使用到的库有: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加速就可以了。

  • 相关阅读:
    hdu2328 Corporate Identity
    hdu1238 Substrings
    hdu4300 Clairewd’s message
    hdu3336 Count the string
    hdu2597 Simpsons’ Hidden Talents
    poj3080 Blue Jeans
    poj2752 Seek the Name, Seek the Fame
    poj2406 Power Strings
    hust1010 The Minimum Length
    hdu1358 Period
  • 原文地址:https://www.cnblogs.com/oloroso/p/6149000.html
Copyright © 2011-2022 走看看