2017-05-15 3 views
0

CentOS 7에 동적으로 링크 된 Qt 5.7 위젯 응용 프로그램을 배포하려고합니다. 문제가되지 않더라도 문제없이 컴퓨터에서 작동합니다 디렉토리를 빌드하려면 libQt5Widgets.so을 복사하십시오. 내가 다른 컴퓨터에 응용 프로그램을 복사 할 경우, 그것은 말한다 :CentOS 7에서 동적으로 링크 된 Qt 5.7 위젯 응용 프로그램 배포 - 공유 라이브러리를 열 수 없음

./Application: error while loading shared libraries: libQt5Widgets.so.5: cannot open shared object file: No such file or directory 

내가 함께 종속성을 검사 할 때 :

ldd ./Application 

결과입니다

linux-vdso.so.1 => (0x00007ffdb7126000) 
libQt5Widgets.so.5 => /opt/Qt5.7.0/5.7/gcc_64/lib/libQt5Widgets.so.5 (0x00007f2d3f33e000) 
libQt5Gui.so.5 => /opt/Qt5.7.0/5.7/gcc_64/lib/libQt5Gui.so.5 (0x00007f2d3eb95000) 
libQt5Network.so.5 => /opt/Qt5.7.0/5.7/gcc_64/lib/libQt5Network.so.5 (0x00007f2d3e837000) 
libQt5Core.so.5 => /opt/Qt5.7.0/5.7/gcc_64/lib/libQt5Core.so.5 (0x00007f2d3e11c000) 
libGL.so.1 => /lib64/libGL.so.1 (0x00007f2d3de97000) 
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f2d3dc7b000) 
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f2d3d972000) 
libm.so.6 => /lib64/libm.so.6 (0x00007f2d3d66f000) 
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f2d3d459000) 
libc.so.6 => /lib64/libc.so.6 (0x00007f2d3d098000) 
libz.so.1 => /lib64/libz.so.1 (0x00007f2d3ce81000) 
libicui18n.so.56 => /opt/Qt5.7.0/5.7/gcc_64/lib/libicui18n.so.56 (0x00007f2d3c9e7000) 
libicuuc.so.56 => /opt/Qt5.7.0/5.7/gcc_64/lib/libicuuc.so.56 (0x00007f2d3c62f000) 
libicudata.so.56 => /opt/Qt5.7.0/5.7/gcc_64/lib/libicudata.so.56 (0x00007f2d3ac4b000) 
libdl.so.2 => /lib64/libdl.so.2 (0x00007f2d3aa47000) 
libgthread-2.0.so.0 => /lib64/libgthread-2.0.so.0 (0x00007f2d3a845000) 
librt.so.1 => /lib64/librt.so.1 (0x00007f2d3a63c000) 
libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x00007f2d3a305000) 
/lib64/ld-linux-x86-64.so.2 (0x00007f2d3fb8e000) 
libexpat.so.1 => /lib64/libexpat.so.1 (0x00007f2d3a0db000) 
libxcb-dri3.so.0 => /lib64/libxcb-dri3.so.0 (0x00007f2d39ed7000) 
libxcb-present.so.0 => /lib64/libxcb-present.so.0 (0x00007f2d39cd4000) 
libxcb-randr.so.0 => /lib64/libxcb-randr.so.0 (0x00007f2d39ac6000) 
libxcb-xfixes.so.0 => /lib64/libxcb-xfixes.so.0 (0x00007f2d398bd000) 
libxcb-render.so.0 => /lib64/libxcb-render.so.0 (0x00007f2d396b3000) 
libxcb-shape.so.0 => /lib64/libxcb-shape.so.0 (0x00007f2d394af000) 
libxcb-sync.so.1 => /lib64/libxcb-sync.so.1 (0x00007f2d392a7000) 
libxshmfence.so.1 => /lib64/libxshmfence.so.1 (0x00007f2d390a4000) 
libglapi.so.0 => /lib64/libglapi.so.0 (0x00007f2d38e75000) 
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f2d38c4d000) 
libXext.so.6 => /lib64/libXext.so.6 (0x00007f2d38a3b000) 
libXdamage.so.1 => /lib64/libXdamage.so.1 (0x00007f2d38838000) 
libXfixes.so.3 => /lib64/libXfixes.so.3 (0x00007f2d38631000) 
libX11-xcb.so.1 => /lib64/libX11-xcb.so.1 (0x00007f2d3842f000) 
libX11.so.6 => /lib64/libX11.so.6 (0x00007f2d380f1000) 
libxcb-glx.so.0 => /lib64/libxcb-glx.so.0 (0x00007f2d37ed6000) 
libxcb-dri2.so.0 => /lib64/libxcb-dri2.so.0 (0x00007f2d37cd1000) 
libxcb.so.1 => /lib64/libxcb.so.1 (0x00007f2d37aaf000) 
libXxf86vm.so.1 => /lib64/libXxf86vm.so.1 (0x00007f2d378a8000) 
libdrm.so.2 => /lib64/libdrm.so.2 (0x00007f2d37699000) 
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f2d37437000) 
libXau.so.6 => /lib64/libXau.so.6 (0x00007f2d37233000) 

이 문제를 해결하기 위해, 다음 라이브러리를 배포하려고 시도했습니다.

Qt5.7.0/5.7/gcc_64/lib/libicui18n.so.56 
Qt5.7.0/5.7/gcc_64/lib/libicuuc.so.56 
Qt5.7.0/5.7/gcc_64/lib/libicudata.so.56 
Qt5.7.0/5.7/gcc_64/lib/libQt5Core.so.5.7.0 
Qt5.7.0/5.7/gcc_64/lib/libQt5Widgets.so.5.7.0 
Qt5.7.0/5.7/gcc_64/lib/libQt5Gui.so.5.7.0 
Qt5.7.0/5.7/gcc_64/lib/libQt5Network.so.5.7.0 
응용 프로그램과 함께

또한, 심볼릭 링크를 만들었습니다.

libQt5Core.so.5 
libQt5Widgets.so.5 
libQt5Gui.so.5 
libQt5Network.so.5 

~ libQt5Widgets.so.5.0.7과 다른 Qt 5.7 라이브러리를 만들었습니다. 나머지 공유 라이브러리는 다른 컴퓨터에도 존재합니다. 하지만 여전히 작동하지 않습니다.

이것은 다음 주제와 관련되어 있습니다. Qt project release ubuntu - error while loading shared libraries: libQt5Widgets.so.5QT5.7 How to deploy Qt Application on Linux 그러나 해결책이 없습니다.

  1. 무엇이 문제 일 수 있나요?
  2. 어떻게 해결할 수 있습니까?

미리 감사드립니다.

답변

0

가 여기에 언급 된 바와 같이 : Qt for Linux/X11 - Deployment (Creating the application package)

...하지만 공유 라이브러리와 주요 문제는 당신이 동적 링커는 Qt는 라이브러리를 찾을 수 있도록해야한다는 것이다. 달리 언급하지 않는 한, 동적 링커는 응용 프로그램이있는 디렉토리를 검색하지 않습니다.

  • 당신은 (대부분의 시스템에서, 예를 들어는/usr/lib에) 시스템 라이브러리 경로 중 하나에 Qt는 라이브러리를 설치할 수 있습니다

이 문제를 극복하기 위해 3 개 솔루션이 있습니다.

  • 응용 프로그램을 연결할 때 미리 지정된 경로를 -rpath 명령 줄 옵션에 전달할 수 있습니다. 이렇게하면 응용 프로그램을 시작할 때 동적 링커가이 디렉토리를 볼 수 있습니다.
  • 당신은 (당신이 동적 링커 구성을 수정 응용 프로그램에 대한 시작 스크립트를 작성할 수 있습니다 예를 들어, LD_LIBRARY_PATH 환경 변수에 응용 프로그램의 디렉토리를 추가.

    1. 내가 선호하지 않는다 첫 번째 옵션은 간단한 응용 프로그램에 대해 /usr/bin 디렉토리를 오염시키지 않습니다.

    2. Qt 생성자의 Build & Run 탭에서 Add build library search path to LD_LIBRARY_PATH의 옵션이 기본적으로 선택됩니다. 또한 Makefile (빌드 디렉토리에 있음)의 내용에는 LFLAGS에 대해 -rpath 옵션이 지정되어 있습니다. 이유는 모르지만이 옵션이 저에게 맞지 않습니다.

    3. 나는 세 번째 옵션을 선호했습니다. 필자가 제공 한 링크에는 사용할 수있는 스크립트가 있습니다.

    Application.sh

    #!/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 "[email protected]" 
    

    그러나 문서는 경고한다 :

    참고 : 응용 프로그램이 "실행에 설정된 사용자 ID"로 실행이 될 경우와 경우 루트가 소유하게되면 일부 플랫폼에서는 LD_LIBRARY_PATH가 무시됩니다. 이 경우 LD_LIBRARY_PATH 접근법을 사용할 수 없습니다.

    또한, 당신은 설명서에 따라, 당신은 응용 프로그램의 디렉토리에 platforms/libqxcb.soThe Qt xcb platform plugin을 포함 할 필요가 있음을주의해야한다. 당신은에서 찾을 수 있습니다 : 다음을 수행 한 후

    Qt5.7.0/5.7/gcc_64/plugins/platforms/libqxcb.so 
    

    , 당신은 여전히 ​​문제을해야합니다. libqxcb.so 다른 종속성이 있기 때문에 (당신이 명령으로 확인할 수 있습니다 ldd libqxcb.so를)

    This application failed to start because it could not find or load the Qt platform plugin "xcb" 
    in "". 
    
    Available platform plugins are: xcb. 
    
    Reinstalling the application may fix this problem. 
    ./Application.sh: line 12: 3783 Aborted (core dumped) $dirname/$appname "[email protected]" 
    

    이 : 그것은 불평합니다

    libQt5XcbQpa.so.5 
    libQt5DBus.so.5 
    

    그것을 해결하기 위해, 당신은에서 공유 라이브러리를 복사해야 :

    Qt5.7.0/5.7/gcc_64/lib/libQt5XcbQpa.so.5.7.0 
    Qt5.7.0/5.7/gcc_64/lib/libQt5DBus.so.5.7.0 
    

    만들고 해당 기호 링크 :

    ,536,913,632 10
    libQt5XcbQpa.so.5 
    libQt5DBus.so.5 
    

    다른 공유 라이브러리, 실행 파일 및 스크립트가있는 디렉토리에 있습니다. 이고 공유 라이브러리의 심볼릭 링크는 libQt5으로 시작합니다. 그렇지 않으면 여전히 열 수 없습니다. 다음과 같이

    간단하게는, 디렉토리의 내용은 다음과 같습니다

    Application (The executable) 
    Application.sh (The script you will execute to run your application) 
    libicudata.so.56 
    libicui18n.so.56 
    libicuuc.so.56 
    libQt5Core.so.5 -> libQt5Core.so.5.7.0 
    libQt5Core.so.5.7.0 
    libQt5DBus.so.5 -> libQt5DBus.so.5.7.0 
    libQt5DBus.so.5.7.0 
    libQt5Gui.so.5 -> libQt5Gui.so.5.7.0 
    libQt5Gui.so.5.7.0 
    libQt5Network.so.5 -> libQt5Network.so.5.7.0 
    libQt5Network.so.5.7.0 
    libQt5Widgets.so.5 -> libQt5Widgets.so.5.7.0 
    libQt5Widgets.so.5.7.0 
    libQt5XcbQpa.so.5 -> libQt5XcbQpa.so.5.7.0 
    libQt5XcbQpa.so.5.7.0 
    platforms/libqxcb.so