2011-11-04 3 views
3

처음 질문 : /etc/ld.so.conf.d에 설정 파일을 두지 않고 클라이언트가 내 SDK에 대해 빌드 할 수있는 방법이 필요합니다. RHEL5.7 및 RHEL6.1은 모두 gcc의 기본 설치를 사용합니다. 이 경우 LD_LIBRARY_PATH 설정은 작동하지 않습니다. 고객이 자신의 시스템을 구성하는 방법에 대한 기술 자료 문서를 제공하지 않고도 내 sdk와 연결할 수있는 다른 방법이 있습니까? 아래 내용을 읽어 보시기 바랍니다.컴파일 시간에 연결하기 vs 런타임에서 링크하기 std :: library와 연결하기

둘째 senario :

나는 RHEL5 및 RHEL6 모두 런타임 SDK의 빌드에 대한 책임입니다. 내 RHEL5.1 상자는 표준 RHEL6.1 상자와 마찬가지로 등록되지 않은 표준 설치입니다. 하지만, 내 RHEL6 상자 나 자신 GCC 컴파일 :

[[email protected] ~]$ cat /etc/redhat-release; gcc --version 
Red Hat Enterprise Linux Server release 5.7 (Tikanga) 
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-51) 
Copyright (C) 2006 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOS 

-

[[email protected] session2]$ cat /etc/redhat-release; gcc --version 
Red Hat Enterprise Linux Server release 6.1 (Santiago) 
gcc (GCC) 4.5.2 
Copyright (C) 2010 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE 

을 -

나는 .so를 나는에 연결하는 것을 시도하고있다 .A 파일을 제공 할 수

. 그러나, 나는 일어나고있는 것을 묘사하려고 노력할 것이다. 동일한 소스를 가져 와서 내 SDK에 맞게 빌드하고 실행하십시오.

RHEL 6 박스 : 나는 다음과 같은 결과를 얻을 수

[[email protected] session2]$ ls -l 
total 1848 
-rw-rw-r-- 1 mehoggan mehoggan  189 Nov 3 13:02 main.cpp 
-rw-rw-r-- 1 mehoggan mehoggan  845 Nov 3 13:02 mainwindow.cpp 
-rw-rw-r-- 1 mehoggan mehoggan  288 Nov 3 13:02 mainwindow.h 
-rwxrwxr-x 1 mehoggan mehoggan 25818 Nov 4 09:26 Session2 
-rw-rw-r-- 1 mehoggan mehoggan  649 Nov 3 13:02 Session2.pro 
-rw-rw-r-- 1 mehoggan mehoggan 1847296 Nov 3 13:02 vc90.pdb 
[[email protected] session2]$ qmake 
[[email protected] session2]$ cat Session2.pro 
#------------------------------------------------- 
# 
# Project created by QtCreator 2011-10-21T09:32:55 
# 
#------------------------------------------------- 

QT += core gui 

TARGET = Session2 
TEMPLATE = app 


SOURCES += main.cpp\ 
     mainwindow.cpp 

HEADERS += mainwindow.h 

#Modify the path accordingly 
CONFIG += debug_and_release 
INCLUDEPATH += "/home/mehoggan/arcgis/runtime_sdk/qt10.1/SDK/include" 
CONFIG(debug, debug|release) { 
    LIBS += -L"/home/mehoggan/arcgis/runtime_sdk/qt10.1/SDK/bin" \ 
      -lArcGISQtd 
} else { 
    LIBS += -L"/home/mehoggan/arcgis/runtime_sdk/qt10.1/SDK/bin" \ 
      -lArcGISQt 
} 
[[email protected] session2]$ make 
make -f Makefile.Release 
make[1]: Entering directory `/home/mehoggan/arcgis/runtime_sdk/qt10.1/SDK/workshops/session2' 
g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -I/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/mkspecs/default -I. -I/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/include/QtCore -I/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/include/QtGui -I/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/include -I../../include -Irelease -o release/main.o main.cpp 
g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -I/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/mkspecs/default -I. -I/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/include/QtCore -I/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/include/QtGui -I/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/include -I../../include -Irelease -o release/mainwindow.o mainwindow.cpp 
/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/bin/moc -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -I/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/mkspecs/default -I. -I/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/include/QtCore -I/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/include/QtGui -I/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/include -I../../include -Irelease mainwindow.h -o release/moc_mainwindow.cpp 
g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -I/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/mkspecs/default -I. -I/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/include/QtCore -I/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/include/QtGui -I/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/include -I../../include -Irelease -o release/moc_mainwindow.o release/moc_mainwindow.cpp 
g++ -m64 -Wl,-O1 -Wl,-rpath,/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/lib -o Session2 release/main.o release/mainwindow.o release/moc_mainwindow.o -L/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/lib -L/home/mehoggan/arcgis/runtime_sdk/qt10.1/SDK/bin -lArcGISQt -lQtGui -lQtCore -lpthread 
make[1]: Leaving directory `/home/mehoggan/arcgis/runtime_sdk/qt10.1/SDK/workshops/session2' 
[[email protected] session2]$ echo ${LD_LIBRARY_PATH} 
/home/mehoggan/arcgis/runtime_sdk/qt10.1/ArcGISRuntime10.1/LocalServerLx/bin/wine/lib64:/home/mehoggan/arcgis/runtime_sdk/qt10.1/ArcGISRuntime10.1/LocalServerLx/bin/wine/lib64/wine:/home/mehoggan/arcgis/runtime_sdk/qt10.1/ArcGISRuntime10.1/LocalServerLx/bin/wine/lib64/wine/supp:/home/mehoggan/arcgis/runtime_sdk/qt10.1/ArcGISRuntime10.1/LocalServerLx/bin/wine/lib64:/home/mehoggan/arcgis/runtime_sdk/qt10.1/ArcGISRuntime10.1/LocalServerLx/bin/wine/lib64/wine:/home/mehoggan/arcgis/runtime_sdk/qt10.1/ArcGISRuntime10.1/LocalServerLx/bin/wine/lib64/wine/supp: 
[[email protected] session2]$ ./Session2 
./Session2: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by /home/mehoggan/arcgis/runtime_sdk/qt10.1/SDK/bin/libArcGISQt.so.1) 

나는 다음과 같은 명령을 실행하는 경우 : /etc/ld.so.conf.d에 export LD_LIBRARY_PATH=/usr/local/lib64:${LD_LIBRARY_PATH}; ./Session2 또는 설정 된 libstdc의 컴파일 된 버전의 경로를 ++ 응용 프로그램이 실행됩니다.

RHEL5 상자 :

[[email protected] session2]$ ls -l 
total 1852 
-rw-rw-r-- 1 mehoggan mehoggan  189 Nov 3 15:21 main.cpp 
-rw-rw-r-- 1 mehoggan mehoggan  845 Nov 3 15:21 mainwindow.cpp 
-rw-rw-r-- 1 mehoggan mehoggan  288 Nov 3 15:21 mainwindow.h 
-rw-rw-r-- 1 mehoggan mehoggan  649 Nov 3 15:21 Session2.pro 
-rw-rw-r-- 1 mehoggan mehoggan 25151 Nov 3 15:51 Session2.pro.user 
-rw-rw-r-- 1 mehoggan mehoggan 1847296 Nov 3 15:21 vc90.pdb 
[[email protected] session2]$ qmake 
[[email protected] session2]$ ls -l ./Session2.pro 
-rw-rw-r-- 1 mehoggan mehoggan 649 Nov 3 15:21 ./Session2.pro 
[[email protected] session2]$ cat ./Session2.pro 
#------------------------------------------------- 
# 
# Project created by QtCreator 2011-10-21T09:32:55 
# 
#------------------------------------------------- 

QT += core gui 

TARGET = Session2 
TEMPLATE = app 


SOURCES += main.cpp\ 
     mainwindow.cpp 

HEADERS += mainwindow.h 

#Modify the path accordingly 
CONFIG += debug_and_release 
INCLUDEPATH += "/home/mehoggan/arcgis/runtime_sdk/qt10.1/SDK/include" 
CONFIG(debug, debug|release) { 
    LIBS += -L"/home/mehoggan/arcgis/runtime_sdk/qt10.1/SDK/bin" \ 
      -lArcGISQtd 
} else { 
    LIBS += -L"/home/mehoggan/arcgis/runtime_sdk/qt10.1/SDK/bin" \ 
      -lArcGISQt 
} 
[[email protected] session2]$ make 
make -f Makefile.Release 
make[1]: Entering directory `/home/mehoggan/arcgis/runtime_sdk/qt10.1/SDK/workshops/session2' 
g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -I/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/mkspecs/default -I. -I/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/include/QtCore -I/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/include/QtGui -I/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/include -I../../include -Irelease -o release/main.o main.cpp 
g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -I/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/mkspecs/default -I. -I/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/include/QtCore -I/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/include/QtGui -I/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/include -I../../include -Irelease -o release/mainwindow.o mainwindow.cpp 
/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/bin/moc -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -I/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/mkspecs/default -I. -I/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/include/QtCore -I/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/include/QtGui -I/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/include -I../../include -Irelease mainwindow.h -o release/moc_mainwindow.cpp 
g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -I/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/mkspecs/default -I. -I/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/include/QtCore -I/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/include/QtGui -I/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/include -I../../include -Irelease -o release/moc_mainwindow.o release/moc_mainwindow.cpp 
g++ -m64 -Wl,-O1 -Wl,-rpath,/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/lib -o Session2 release/main.o release/mainwindow.o release/moc_mainwindow.o -L/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/lib -L/home/mehoggan/arcgis/runtime_sdk/qt10.1/SDK/bin -lArcGISQt -lQtGui -lQtCore -lpthread 
/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/lib/libQtGui.so: undefined reference to `FT_Library_SetLcdFilter' 
/home/mehoggan/arcgis/runtime_sdk/qt10.1/SDK/bin/libArcGISQt.so: undefined reference to `std::_List_node_base::_M_unhook()@GLIBCXX_3.4.14' 
/home/mehoggan/arcgis/runtime_sdk/qt10.1/SDK/bin/libArcGISQt.so: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)@GLIBCXX_3.4.9' 
/home/mehoggan/arcgis/runtime_sdk/qt10.1/SDK/bin/libArcGISQt.so: undefined reference to `std::_List_node_base::_M_hook(std::_List_node_base*)@GLIBCXX_3.4.14' 
/home/mehoggan/QtSDK/Desktop/Qt/474/gcc/lib/libQtGui.so: undefined reference to `FcFreeTypeQueryFace' 
/home/mehoggan/arcgis/runtime_sdk/qt10.1/SDK/bin/libArcGISQt.so: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::basic_ostream<char, std::char_traits<char> >::_M_insert<double>(double)@GLIBCXX_3.4.9' 
/home/mehoggan/arcgis/runtime_sdk/qt10.1/SDK/bin/libArcGISQt.so: undefined reference to `std::ctype<char>::_M_widen_init() [email protected]_3.4.11' 
collect2: ld returned 1 exit status 
make[1]: *** [Session2] Error 1 
make[1]: Leaving directory `/home/mehoggan/arcgis/runtime_sdk/qt10.1/SDK/workshops/session2' 
make: *** [release] Error 2 

이 정말로 긴 포스트로지고, 나는 내가 도움을 시작하기에 충분히 제공하고 있습니다 생각합니다. 도움이 필요한 것이 필요한 경우 알려 주시기 바랍니다.

libstdC++에 대한 정보 하나가 마지막으로 연결됩니다.

RHEL6: 
[[email protected] session2]$ strings /usr/local/lib64/libstdc++.so.6 | grep GLIB 
GLIBCXX_3.4 
GLIBCXX_3.4.1 
GLIBCXX_3.4.2 
GLIBCXX_3.4.3 
GLIBCXX_3.4.4 
GLIBCXX_3.4.5 
GLIBCXX_3.4.6 
GLIBCXX_3.4.7 
GLIBCXX_3.4.8 
GLIBCXX_3.4.9 
GLIBCXX_3.4.10 
GLIBCXX_3.4.11 
GLIBCXX_3.4.12 
GLIBCXX_3.4.13 
GLIBCXX_3.4.14 
GLIBC_2.2.5 
GLIBC_2.3 
GLIBC_2.3.2 
GLIBCXX_FORCE_NEW 
GLIBCXX_DEBUG_MESSAGE_LENGTH 

RHEL5가 :

[[email protected] session2]$ strings /usr/lib64/libstdc++.so.6 | grep GLIBC 
GLIBCXX_3.4 
GLIBCXX_3.4.1 
GLIBCXX_3.4.2 
GLIBCXX_3.4.3 
GLIBCXX_3.4.4 
GLIBCXX_3.4.5 
GLIBCXX_3.4.6 
GLIBCXX_3.4.7 
GLIBCXX_3.4.8 
GLIBC_2.3 
GLIBC_2.3.2 
GLIBC_2.4 
GLIBC_2.2.5 
GLIBCXX_FORCE_NEW 

답변

3

그것은 당신의 Qt는 라이브러리처럼 보이는 (libQtGui.so 및 libArcGISQt.so는) 아마, 당신의 RHEL 5 상자에 존재하지 않는 GLIBCXX_3.4.14에 대한 종속성을 가지고 RHEL 6 상자에 설치하여 (Qt) 설치하십시오. RHEL 5에서 Qt를 빌드하거나 RHEL 5 상자에서 업데이트 된 3.4.14 lib에 대한 액세스를 제공해야합니다. 바이너리를 실행하고자하는 사람은 빌드 된 공유 라이브러리의 올바른 버전에 액세스해야합니다.

라이브러리에 '액세스'하려면 해당 컴퓨터에서 읽을 수 있어야하며 LD_LIBRARY_PATH의 ld.so.conf에서 구성한 위치에 있어야합니다. 앱이 실행될 때 envvar가 실행되어야합니다 , 또는 -rpath 링크 옵션을 통해 실행 파일에 구성됩니다.

한 가지 연결 옵션은이 문제를 피하거나 다루는 데 매우 유용하다고 생각하면 -Wl,-rpath,'$ORIGIN'입니다. 이렇게하면 응용 프로그램이 ld.so.conf뿐만 아니라 (또한 선호하는) 동적 라이브러리에 대한 실행 파일을 포함하는 디렉토리를 검색하게됩니다. 따라서 실행 파일을 빌드하고 실행 파일과 .sl 동적 라이브러리의 패키지를 사람들에게 제공하고 ".so 파일을 컴퓨터에 설치하거나 실행 파일과 같은 디렉토리에 모두 저장할 수 있습니다. "그리고 그들은 너무 많은 문제없이 실행 파일을 실행할 수 있습니다.이것은 거의 모든 리눅스 변형에서 사용할 수있는 단일 바이너리 패키지를 허용합니다. 당신이 메이크 파일이 옵션을 넣을 때 일반적으로 변수 확장 ($$$로 확장)로 $을 취급 메이크업으로 -Wl,-rpath,'$$ORIGIN' 할 필요가

참고. qmake는 같을 수 있습니다.