2013-03-29 9 views
5

Ich versuche so zu statische Versionen der POCO C++ Libs zu verknüpfen:poco C++ statische Linken Probleme mit undefinierten Verweise auf Symbole

g++ BCCMain.o -L$_POCO_LIBS -Wl,-Bstatic $_POCO_LIBS/libPocoFoundation.a $_POCO_LIBS/libPocoUtil.a $_POCO_LIBS/libPocoXML.a $_POCO_LIBS/libPocoJSON.a -Wl,-Bdynamic -o BCMain 

Unfortunatelly dies gibt Fehler über einige undefinierte Verweise auf Symbole wie:

Poco::Logger::get(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) 

obwohl Poco::Logger::get(std::string const&) tatsächlich in libPocoFoundation.a definiert ist.

Nun, wenn ich versuche, auf eine gemeinsam genutzte Version der Stiftung zu verknüpfen lib es funktioniert:

g++ BCCMain.o -L$_POCO_LIBS -Wl,-Bstatic $_POCO_LIBS/libPocoFoundation.a $_POCO_LIBS/libPocoUtil.a $_POCO_LIBS/libPocoXML.a $_POCO_LIBS/libPocoJSON.a -Wl,-Bdynamic -lPocoFoundation -o BCMain 

Static und Shared-Versionen der Bibliotheken haben die gleichen Symbole, so finde ich es schwer zu verstehen, was ich bin falsch machen.

Ubuntu/Linaro. g ++ 4.6.3

+0

ich auch POCO_STATIC definiert beim Kompilieren. Hat nicht geholfen. – gregee123

Antwort

1

Ich habe es geschafft, dies zu lösen, indem ich das Kompilieren und Verknüpfen getrennt habe. Hier ist, was mir wie folgt aussieht:

Compile: g++ -c -std=c++0x -ggdb -I/home/bbogart/src/of_v0071_linux64_release/libs/poco/include pkg-config opencv --cflags *.cpp

Link: g++ *.o -L/home/bbogart/src/of_v0071_linux64_release/libs/poco/lib/linux64/ -lPocoNet -lPocoUtil -lPocoFoundation -lopencv_gpu pkg-config opencv --libs -o cameraGrabber

Beachten Sie, dass Sie Lasse die "lib" und ".a" aus den lib-Namen weg.

14

Meine Erfahrung ist, dass die Reihenfolge der Verknüpfung der Poco-Bibliotheken wichtig ist, wenn sie statisch verknüpft sind. Scheint eine wichtige Grundlage zu sein, die letzte zu sein.

Die Reihenfolge, die für mich funktioniert, ist:

  1. Util
  2. Net
  3. XML
  4. Foundation
+0

Gah! Danke, das war es! – Cameron

+0

Ja, die statische Verknüpfungsreihenfolge mit gcc ist wichtig, und die internen Abhängigkeiten zwischen diesen Bibliotheken müssen berücksichtigt werden. Es handelt sich nicht nur um ein POCO-Problem, sondern um ein allgemeines Verhalten in der statischen Verknüpfung von gcc. In diesem Fall hängt Util beispielsweise von XML ab (Sie können es im Code überprüfen), und alle Bibliotheken hängen von Foundation ab. Unabhängige Bibliotheken stehen an erster Stelle, und die Anforderungen dieser Bibliotheken sollten nach ihnen liegen. – drodri

+2

Auch gibt es PocoJSON, die zwischen Util und Net Bibliotheken sein sollte. – Bogolt

Verwandte Themen