2011-11-04 3 views
3

D'abord la question: J'ai besoin d'un moyen sans placer un fichier de configuration dans /etc/ld.so.conf.d pour permettre aux clients de construire sur mon SDK RHEL5.7 et RHEL6.1 utilisant l'installation par défaut de gcc. La définition de LD_LIBRARY_PATH ne fonctionne pas dans ce cas. Existe-t-il d'autres moyens de permettre aux clients de se lier à mon sdk sans avoir à leur fournir un article de base de connaissances sur la façon de configurer leur système? Veuillez lire ci-dessous pour plus de précisions.Liaison au moment de la compilation vs Liaison au runtime Contre std :: library

Deuxièmement, le senario:

Je suis responsable de la construction d'un SDK d'exécution sur les deux RHEL5 et RHEL6. Ma boîte RHEL5.7 est une installation standard non-enregistrée comme ma boîte RHEL6.1. Cependant, sur ma boîte RHEL6 j'ai compilé gcc moi-même:

[[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 

-

Je ne peux pas fournir les .donc et .a fichiers que je suis en train de créer un lien contre . Cependant, je vais tenter de décrire ce qui se passe. Prendre la même source et la construire contre mon SDK et l'exécuter. Je reçois les résultats suivants:

RHEL 6 Box:

[[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) 

Si j'exécutez la commande suivante: export LD_LIBRARY_PATH=/usr/local/lib64:${LD_LIBRARY_PATH}; ./Session2 ou définir le chemin à la version compilée de libstdC++ dans /etc/ld.so.conf.d l'application s'exécute.

RHEL5 Box:

[[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 

Cela devient d'être un poste très long, et je crois avoir fourni assez pour commencer à aider. S'il vous plaît laissez-moi savoir si vous avez besoin de quelque chose de spécifique pour aider.

Un dernier bit d'information sur la libstdC++ que je suis en train de lier.

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 

Répondre

3

Il ressemble à vos bibliothèques Qt (libQtGui.so et libArcGISQt.so) ont une dépendance à l'égard GLIBCXX_3.4.14, qui ne figure pas sur votre boîte RHEL 5, probablement comme vous l'avez construit et installé (Qt) sur votre boîte RHEL 6. Vous devez construire Qt sur RHEL 5, ou fournir un accès à la librairie 3.4.14 mise à jour sur la boîte RHEL 5. Tous ceux qui veulent exécuter votre binaire auront besoin d'accéder aux versions correctes des bibliothèques partagées sur lesquelles il a été construit. Pour avoir un accès à une bibliothèque, elle doit être lisible sur la machine en question et être dans un emplacement configuré dans ld.so.conf, dans l'environnement LD_LIBRARY_PATH lorsque l'application est exécutée. , OU configuré dans l'exécutable via une option de lien -rpath.

Une option de liaison que je trouve EXTREMEMENT utile pour éviter/traiter ce problème est -Wl,-rpath,'$ORIGIN'. Cela entraînera l'application à chercher dans le répertoire contenant l'exécutable pour les bibliothèques dynamiques ainsi que (et de préférence) ld.so.conf. Vous pouvez donc créer un exécutable et donner aux gens un paquet avec l'exécutable et un tas de librairies dynamiques .so et leur dire "installez les fichiers .so sur votre machine ou collez-les tous dans le même répertoire que l'exécutable, selon votre préférence "et puis ils peuvent exécuter l'exécutable sans trop de problèmes.Cela permet un paquet binaire unique qui peut être utilisé sur pratiquement n'importe quelle variante de Linux.

Notez que lorsque vous mettez cette option dans un Makefile il doit généralement être -Wl,-rpath,'$$ORIGIN' comme marque traitera la $ comme une extension variable ($$ se développe pour $). qmake peut être le même.

Questions connexes