alfons
27-05-2010, 13:57
salve a tutti!
ho un problema del quale non riesco a venire a capo
premetto che mi trovo su unix (freebsd). in un programma ho un binario che, tra le altre, dev'essere linkato a due librerie, A e B. la libreria B, di suo, e' gia' linkata alla libreria A, senza problemi
insomma, quando arrivo a linkare il binario, tutto fallisce riportando undefined references a simboli della libreria A. ho controllato tutti gli -rpath del caso, i percorsi sembrano tutti giusti... la mia sensazione e' che ci sia qualche problema nella compilazione/linkaggio della libreria A, per cui la B "crede" di esservisi linkata, ma poi quando deve effettivamente recuperarne i simboli non li trova. mi sono gia' trovato una volta in una situazione simile, ed il problema era proprio la libreria A, che era obsoleta. in questo caso pero' sono tutte parti dello stesso progetto...
aggiungo un dettaglio non trascurabile: compilando sulle qt 4.6 (si linkano anche ed esse) tutto funziona, il problema si presenta con la beta delle qt 4.7. ho cercato qualche differenza nelle macro: l'unica che mi sembra poter influire in qualche modo e' quella che setta la __visibility__, ma e' uguale in entrambe le versioni...
quindi: non so piu' dove sbattere la testa. non vi chiedo di risolvermi il problema, ma almeno di suggerirmi qualche strada da prendere, perche' su internet non trovo ne' spiegazioni dettagliate su come funziona un linker (ld, in questo caso), ne' risposte "alternative" (quelle classiche le conosco a memoria) al problema delle undefined references
e ora un piccolo estratto dal log
il linkaggio della libreria A:
Linking CXX shared library libsoprano.so
cd /work/a/ports/textproc/soprano/work/soprano-2.4.63/soprano && /usr/local/bin/cmake -E cmake_link_script CMakeFiles/soprano.dir/link.txt --verbose=1
/opt/c++ -fPIC -O2 -pipe -fno-strict-aliasing -Wnon-virtual-dtor -Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -Wall -W -Wpointer-arith -Wformat-security -fno-check-new -fno-common -fvisibility=hidden -fvisibility-inlines-hidden -shared -Wl,-soname,libsoprano.so.4 -o libsoprano.so.4.3.0 CMakeFiles/soprano.dir/queryresultiterator.cpp.o CMakeFiles/soprano.dir/queryresultiteratorbackend.cpp.o CMakeFiles/soprano.dir/node.cpp.o CMakeFiles/soprano.dir/statement.cpp.o CMakeFiles/soprano.dir/statementiterator.cpp.o CMakeFiles/soprano.dir/nodeiterator.cpp.o CMakeFiles/soprano.dir/model.cpp.o CMakeFiles/soprano.dir/parser.cpp.o CMakeFiles/soprano.dir/serializer.cpp.o CMakeFiles/soprano.dir/pluginmanager.cpp.o CMakeFiles/soprano.dir/pluginstub.cpp.o CMakeFiles/soprano.dir/plugin.cpp.o CMakeFiles/soprano.dir/qhashqurlcompat.cpp.o CMakeFiles/soprano.dir/backend.cpp.o CMakeFiles/soprano.dir/global.cpp.o CMakeFiles/soprano.dir/error.cpp.o CMakeFiles/soprano.dir/literalvalue.cpp.o CMakeFiles/soprano.dir/languagetag.cpp.o CMakeFiles/soprano.dir/locator.cpp.o CMakeFiles/soprano.dir/datetime.cpp.o CMakeFiles/soprano.dir/version.cpp.o CMakeFiles/soprano.dir/filtermodel.cpp.o CMakeFiles/soprano.dir/storagemodel.cpp.o CMakeFiles/soprano.dir/rdfschemamodel.cpp.o CMakeFiles/soprano.dir/bindingset.cpp.o CMakeFiles/soprano.dir/sopranotypes.cpp.o CMakeFiles/soprano.dir/graph.cpp.o CMakeFiles/soprano.dir/vocabulary/rdf.cpp.o CMakeFiles/soprano.dir/vocabulary/rdfs.cpp.o CMakeFiles/soprano.dir/vocabulary/xsd.cpp.o CMakeFiles/soprano.dir/vocabulary/nrl.cpp.o CMakeFiles/soprano.dir/vocabulary/nao.cpp.o CMakeFiles/soprano.dir/vocabulary/xesam.cpp.o CMakeFiles/soprano.dir/vocabulary/owl.cpp.o CMakeFiles/soprano.dir/query/query.cpp.o CMakeFiles/soprano.dir/query/queryparser.cpp.o CMakeFiles/soprano.dir/query/queryserializer.cpp.o CMakeFiles/soprano.dir/inference/nodepattern.cpp.o CMakeFiles/soprano.dir/inference/statementpattern.cpp.o CMakeFiles/soprano.dir/inference/inferencerule.cpp.o CMakeFiles/soprano.dir/inference/inferenceruleset.cpp.o CMakeFiles/soprano.dir/inference/sil.cpp.o CMakeFiles/soprano.dir/inference/inferencemodel.cpp.o CMakeFiles/soprano.dir/inference/inferenceruleparser.cpp.o CMakeFiles/soprano.dir/nrlmodel.cpp.o CMakeFiles/soprano.dir/inifile.cpp.o CMakeFiles/soprano.dir/desktopfile.cpp.o CMakeFiles/soprano.dir/sopranopluginfile.cpp.o CMakeFiles/soprano.dir/sopranodirs.cpp.o CMakeFiles/soprano.dir/util/extreadwritelock.cpp.o CMakeFiles/soprano.dir/util/mutexmodel.cpp.o CMakeFiles/soprano.dir/util/mutexstatementiteratorbackend.cpp.o CMakeFiles/soprano.dir/util/mutexnodeiteratorbackend.cpp.o CMakeFiles/soprano.dir/util/mutexqueryresultiteratorbackend.cpp.o CMakeFiles/soprano.dir/util/simplestatementiterator.cpp.o CMakeFiles/soprano.dir/util/simplenodeiterator.cpp.o CMakeFiles/soprano.dir/util/dummymodel.cpp.o CMakeFiles/soprano.dir/util/signalcachemodel.cpp.o CMakeFiles/soprano.dir/util/readonlymodel.cpp.o CMakeFiles/soprano.dir/util/asyncmodel.cpp.o CMakeFiles/soprano.dir/util/asyncresult.cpp.o CMakeFiles/soprano.dir/util/asynccommand.cpp.o CMakeFiles/soprano.dir/util/asynciteratorbackend.cpp.o CMakeFiles/soprano.dir/util/asyncquery.cpp.o /usr/local/lib/qt4/libQtCore.so -pthread -Wl,-rpath,/usr/local/lib/qt4:::::::::::::::
il linkaggio della libreria B:
Linking CXX shared library libsopranoserver.so
cd /work/a/ports/textproc/soprano/work/soprano-2.4.63/server && /usr/local/bin/cmake -E cmake_link_script CMakeFiles/sopranoserver.dir/link.txt --verbose=1
/opt/c++ -fPIC -O2 -pipe -fno-strict-aliasing -Wnon-virtual-dtor -Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -Wall -W -Wpointer-arith -Wformat-security -fno-check-new -fno-common -fvisibility=hidden -fvisibility-inlines-hidden -shared -Wl,-soname,libsopranoserver.so.1 -o libsopranoserver.so.1.2.0 CMakeFiles/sopranoserver.dir/servercore.cpp.o CMakeFiles/sopranoserver.dir/serverconnection.cpp.o CMakeFiles/sopranoserver.dir/modelpool.cpp.o CMakeFiles/sopranoserver.dir/randomgenerator.cpp.o CMakeFiles/sopranoserver.dir/datastream.cpp.o CMakeFiles/sopranoserver.dir/localserver.cpp.o CMakeFiles/sopranoserver.dir/tcpserver.cpp.o CMakeFiles/sopranoserver.dir/dbus/dbusutil.cpp.o CMakeFiles/sopranoserver.dir/dbus/dbusmodeladaptor.cpp.o CMakeFiles/sopranoserver.dir/dbus/dbusexportiterator.cpp.o CMakeFiles/sopranoserver.dir/dbus/dbusexportmodel.cpp.o CMakeFiles/sopranoserver.dir/dbus/dbusstatementiteratoradaptor.cpp.o CMakeFiles/sopranoserver.dir/dbus/dbusnodeiteratoradaptor.cpp.o CMakeFiles/sopranoserver.dir/dbus/dbusqueryresultiteratoradaptor.cpp.o CMakeFiles/sopranoserver.dir/dbus/dbusserveradaptor.cpp.o CMakeFiles/sopranoserver.dir/dbus/dbuscontroller.cpp.o CMakeFiles/sopranoserver.dir/dbus/dbusoperators.cpp.o /usr/local/lib/qt4/libQtCore.so -pthread /usr/local/lib/qt4/libQtNetwork.so ../soprano/libsoprano.so.4.3.0 /usr/local/lib/qt4/libQtDBus.so /usr/local/lib/qt4/libQtCore.so -pthread -Wl,-rpath,/usr/local/lib/qt4:/work/a/ports/textproc/soprano/work/soprano-2.4.63/soprano:
e, infine, il linkaggio del binario:
Linking CXX executable sopranod
cd /work/a/ports/textproc/soprano/work/soprano-2.4.63/server && /usr/local/bin/cmake -E cmake_link_script CMakeFiles/sopranod.dir/link.txt --verbose=1
/opt/c++ -O2 -pipe -fno-strict-aliasing -Wnon-virtual-dtor -Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -Wall -W -Wpointer-arith -Wformat-security -fno-check-new -fno-common -fvisibility=hidden -fvisibility-inlines-hidden CMakeFiles/sopranod.dir/sopranod.cpp.o CMakeFiles/sopranod.dir/sopranodcore.cpp.o CMakeFiles/sopranod.dir/lockfile.cpp.o -o sopranod ../soprano/libsoprano.so.4.3.0 libsopranoserver.so.1.2.0 ../index/libsopranoindex.so.1.1.0 /usr/local/lib/qt4/libQtNetwork.so /usr/local/lib/qt4/libQtDBus.so ../soprano/libsoprano.so.4.3.0 /usr/local/lib/qt4/libQtCore.so -pthread /usr/local/lib/libclucene.so -Wl,-rpath,/work/a/ports/textproc/soprano/work/soprano-2.4.63/soprano:/work/a/ports/textproc/soprano/work/soprano-2.4.63/server:/work/a/ports/textproc/soprano/work/soprano-2.4.63/index:/usr/local/lib/qt4:/usr/local/lib:
CMakeFiles/sopranod.dir/sopranod.cpp.o(.text+0x5b): In function `usage()':
: undefined reference to `Soprano::versionString()'
CMakeFiles/sopranod.dir/sopranodcore.cpp.o(.gnu.linkonce.r._ZTV12SopranodCore+0x58): undefined reference to `Soprano::Error::ErrorCache::lastError() const'
libsopranoserver.so.1.2.0: undefined reference to `Soprano::Error::ErrorCache::ErrorCache()'
...e cosi' via...
grazie a chiunque volesse interessarsi al mio problema!
ho un problema del quale non riesco a venire a capo
premetto che mi trovo su unix (freebsd). in un programma ho un binario che, tra le altre, dev'essere linkato a due librerie, A e B. la libreria B, di suo, e' gia' linkata alla libreria A, senza problemi
insomma, quando arrivo a linkare il binario, tutto fallisce riportando undefined references a simboli della libreria A. ho controllato tutti gli -rpath del caso, i percorsi sembrano tutti giusti... la mia sensazione e' che ci sia qualche problema nella compilazione/linkaggio della libreria A, per cui la B "crede" di esservisi linkata, ma poi quando deve effettivamente recuperarne i simboli non li trova. mi sono gia' trovato una volta in una situazione simile, ed il problema era proprio la libreria A, che era obsoleta. in questo caso pero' sono tutte parti dello stesso progetto...
aggiungo un dettaglio non trascurabile: compilando sulle qt 4.6 (si linkano anche ed esse) tutto funziona, il problema si presenta con la beta delle qt 4.7. ho cercato qualche differenza nelle macro: l'unica che mi sembra poter influire in qualche modo e' quella che setta la __visibility__, ma e' uguale in entrambe le versioni...
quindi: non so piu' dove sbattere la testa. non vi chiedo di risolvermi il problema, ma almeno di suggerirmi qualche strada da prendere, perche' su internet non trovo ne' spiegazioni dettagliate su come funziona un linker (ld, in questo caso), ne' risposte "alternative" (quelle classiche le conosco a memoria) al problema delle undefined references
e ora un piccolo estratto dal log
il linkaggio della libreria A:
Linking CXX shared library libsoprano.so
cd /work/a/ports/textproc/soprano/work/soprano-2.4.63/soprano && /usr/local/bin/cmake -E cmake_link_script CMakeFiles/soprano.dir/link.txt --verbose=1
/opt/c++ -fPIC -O2 -pipe -fno-strict-aliasing -Wnon-virtual-dtor -Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -Wall -W -Wpointer-arith -Wformat-security -fno-check-new -fno-common -fvisibility=hidden -fvisibility-inlines-hidden -shared -Wl,-soname,libsoprano.so.4 -o libsoprano.so.4.3.0 CMakeFiles/soprano.dir/queryresultiterator.cpp.o CMakeFiles/soprano.dir/queryresultiteratorbackend.cpp.o CMakeFiles/soprano.dir/node.cpp.o CMakeFiles/soprano.dir/statement.cpp.o CMakeFiles/soprano.dir/statementiterator.cpp.o CMakeFiles/soprano.dir/nodeiterator.cpp.o CMakeFiles/soprano.dir/model.cpp.o CMakeFiles/soprano.dir/parser.cpp.o CMakeFiles/soprano.dir/serializer.cpp.o CMakeFiles/soprano.dir/pluginmanager.cpp.o CMakeFiles/soprano.dir/pluginstub.cpp.o CMakeFiles/soprano.dir/plugin.cpp.o CMakeFiles/soprano.dir/qhashqurlcompat.cpp.o CMakeFiles/soprano.dir/backend.cpp.o CMakeFiles/soprano.dir/global.cpp.o CMakeFiles/soprano.dir/error.cpp.o CMakeFiles/soprano.dir/literalvalue.cpp.o CMakeFiles/soprano.dir/languagetag.cpp.o CMakeFiles/soprano.dir/locator.cpp.o CMakeFiles/soprano.dir/datetime.cpp.o CMakeFiles/soprano.dir/version.cpp.o CMakeFiles/soprano.dir/filtermodel.cpp.o CMakeFiles/soprano.dir/storagemodel.cpp.o CMakeFiles/soprano.dir/rdfschemamodel.cpp.o CMakeFiles/soprano.dir/bindingset.cpp.o CMakeFiles/soprano.dir/sopranotypes.cpp.o CMakeFiles/soprano.dir/graph.cpp.o CMakeFiles/soprano.dir/vocabulary/rdf.cpp.o CMakeFiles/soprano.dir/vocabulary/rdfs.cpp.o CMakeFiles/soprano.dir/vocabulary/xsd.cpp.o CMakeFiles/soprano.dir/vocabulary/nrl.cpp.o CMakeFiles/soprano.dir/vocabulary/nao.cpp.o CMakeFiles/soprano.dir/vocabulary/xesam.cpp.o CMakeFiles/soprano.dir/vocabulary/owl.cpp.o CMakeFiles/soprano.dir/query/query.cpp.o CMakeFiles/soprano.dir/query/queryparser.cpp.o CMakeFiles/soprano.dir/query/queryserializer.cpp.o CMakeFiles/soprano.dir/inference/nodepattern.cpp.o CMakeFiles/soprano.dir/inference/statementpattern.cpp.o CMakeFiles/soprano.dir/inference/inferencerule.cpp.o CMakeFiles/soprano.dir/inference/inferenceruleset.cpp.o CMakeFiles/soprano.dir/inference/sil.cpp.o CMakeFiles/soprano.dir/inference/inferencemodel.cpp.o CMakeFiles/soprano.dir/inference/inferenceruleparser.cpp.o CMakeFiles/soprano.dir/nrlmodel.cpp.o CMakeFiles/soprano.dir/inifile.cpp.o CMakeFiles/soprano.dir/desktopfile.cpp.o CMakeFiles/soprano.dir/sopranopluginfile.cpp.o CMakeFiles/soprano.dir/sopranodirs.cpp.o CMakeFiles/soprano.dir/util/extreadwritelock.cpp.o CMakeFiles/soprano.dir/util/mutexmodel.cpp.o CMakeFiles/soprano.dir/util/mutexstatementiteratorbackend.cpp.o CMakeFiles/soprano.dir/util/mutexnodeiteratorbackend.cpp.o CMakeFiles/soprano.dir/util/mutexqueryresultiteratorbackend.cpp.o CMakeFiles/soprano.dir/util/simplestatementiterator.cpp.o CMakeFiles/soprano.dir/util/simplenodeiterator.cpp.o CMakeFiles/soprano.dir/util/dummymodel.cpp.o CMakeFiles/soprano.dir/util/signalcachemodel.cpp.o CMakeFiles/soprano.dir/util/readonlymodel.cpp.o CMakeFiles/soprano.dir/util/asyncmodel.cpp.o CMakeFiles/soprano.dir/util/asyncresult.cpp.o CMakeFiles/soprano.dir/util/asynccommand.cpp.o CMakeFiles/soprano.dir/util/asynciteratorbackend.cpp.o CMakeFiles/soprano.dir/util/asyncquery.cpp.o /usr/local/lib/qt4/libQtCore.so -pthread -Wl,-rpath,/usr/local/lib/qt4:::::::::::::::
il linkaggio della libreria B:
Linking CXX shared library libsopranoserver.so
cd /work/a/ports/textproc/soprano/work/soprano-2.4.63/server && /usr/local/bin/cmake -E cmake_link_script CMakeFiles/sopranoserver.dir/link.txt --verbose=1
/opt/c++ -fPIC -O2 -pipe -fno-strict-aliasing -Wnon-virtual-dtor -Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -Wall -W -Wpointer-arith -Wformat-security -fno-check-new -fno-common -fvisibility=hidden -fvisibility-inlines-hidden -shared -Wl,-soname,libsopranoserver.so.1 -o libsopranoserver.so.1.2.0 CMakeFiles/sopranoserver.dir/servercore.cpp.o CMakeFiles/sopranoserver.dir/serverconnection.cpp.o CMakeFiles/sopranoserver.dir/modelpool.cpp.o CMakeFiles/sopranoserver.dir/randomgenerator.cpp.o CMakeFiles/sopranoserver.dir/datastream.cpp.o CMakeFiles/sopranoserver.dir/localserver.cpp.o CMakeFiles/sopranoserver.dir/tcpserver.cpp.o CMakeFiles/sopranoserver.dir/dbus/dbusutil.cpp.o CMakeFiles/sopranoserver.dir/dbus/dbusmodeladaptor.cpp.o CMakeFiles/sopranoserver.dir/dbus/dbusexportiterator.cpp.o CMakeFiles/sopranoserver.dir/dbus/dbusexportmodel.cpp.o CMakeFiles/sopranoserver.dir/dbus/dbusstatementiteratoradaptor.cpp.o CMakeFiles/sopranoserver.dir/dbus/dbusnodeiteratoradaptor.cpp.o CMakeFiles/sopranoserver.dir/dbus/dbusqueryresultiteratoradaptor.cpp.o CMakeFiles/sopranoserver.dir/dbus/dbusserveradaptor.cpp.o CMakeFiles/sopranoserver.dir/dbus/dbuscontroller.cpp.o CMakeFiles/sopranoserver.dir/dbus/dbusoperators.cpp.o /usr/local/lib/qt4/libQtCore.so -pthread /usr/local/lib/qt4/libQtNetwork.so ../soprano/libsoprano.so.4.3.0 /usr/local/lib/qt4/libQtDBus.so /usr/local/lib/qt4/libQtCore.so -pthread -Wl,-rpath,/usr/local/lib/qt4:/work/a/ports/textproc/soprano/work/soprano-2.4.63/soprano:
e, infine, il linkaggio del binario:
Linking CXX executable sopranod
cd /work/a/ports/textproc/soprano/work/soprano-2.4.63/server && /usr/local/bin/cmake -E cmake_link_script CMakeFiles/sopranod.dir/link.txt --verbose=1
/opt/c++ -O2 -pipe -fno-strict-aliasing -Wnon-virtual-dtor -Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -Wall -W -Wpointer-arith -Wformat-security -fno-check-new -fno-common -fvisibility=hidden -fvisibility-inlines-hidden CMakeFiles/sopranod.dir/sopranod.cpp.o CMakeFiles/sopranod.dir/sopranodcore.cpp.o CMakeFiles/sopranod.dir/lockfile.cpp.o -o sopranod ../soprano/libsoprano.so.4.3.0 libsopranoserver.so.1.2.0 ../index/libsopranoindex.so.1.1.0 /usr/local/lib/qt4/libQtNetwork.so /usr/local/lib/qt4/libQtDBus.so ../soprano/libsoprano.so.4.3.0 /usr/local/lib/qt4/libQtCore.so -pthread /usr/local/lib/libclucene.so -Wl,-rpath,/work/a/ports/textproc/soprano/work/soprano-2.4.63/soprano:/work/a/ports/textproc/soprano/work/soprano-2.4.63/server:/work/a/ports/textproc/soprano/work/soprano-2.4.63/index:/usr/local/lib/qt4:/usr/local/lib:
CMakeFiles/sopranod.dir/sopranod.cpp.o(.text+0x5b): In function `usage()':
: undefined reference to `Soprano::versionString()'
CMakeFiles/sopranod.dir/sopranodcore.cpp.o(.gnu.linkonce.r._ZTV12SopranodCore+0x58): undefined reference to `Soprano::Error::ErrorCache::lastError() const'
libsopranoserver.so.1.2.0: undefined reference to `Soprano::Error::ErrorCache::ErrorCache()'
...e cosi' via...
grazie a chiunque volesse interessarsi al mio problema!