2013-03-29 19 views
5

Sto cercando di creare un collegamento a versioni statiche del POCO C++ librerie come questo:Poco C++ problemi di collegamento statiche con riferimenti non definiti ai simboli

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 

Purtroppo questo dà errori su alcuni riferimenti non definiti simboli come:

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

anche se Poco::Logger::get(std::string const&) è effettivamente definito in libPocoFoundation.a.

Ora, se provo a collegare a una versione condivisa della fondazione lib funziona:

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 

versioni statiche e condivise dei librerie hanno gli stessi simboli così faccio fatica a capire quello che sto fare sbagliato

Ubuntu/Linaro. g ++ 4.6.3

+0

Ho anche definito POCO_STATIC durante la compilazione. Non ha aiutato – gregee123

risposta

1

Sono riuscito a risolvere questo separando la compilazione e il collegamento. Ecco cosa miniera assomiglia:

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

Si noti che è ometti "lib" e ".a" dai nomi lib.

14

La mia esperienza è che l'ordine di collegamento delle librerie Poco è importante quando collegato staticamente. Sembra che la Fondazione sia l'ultima.

L'ordine che funziona per me è:

  1. Util
  2. netto
  3. XML
  4. Fondazione
+0

Gah! Grazie, è stato questo! – Cameron

+0

Sì, l'ordine di collegamento statico con gcc è importante e le dipendenze interne tra tali librerie devono essere prese in considerazione. Non è solo un problema POCO, ma un comportamento generale nel collegamento statico gcc. In questo caso, Util dipende da XML (puoi verificarlo nel codice), per esempio, e tutte le librerie dipendono da Foundation. Le librerie indipendenti vengono prima, e i requisiti di queste librerie dovrebbero essere dopo di loro. – drodri

+2

Inoltre c'è PocoJSON che dovrebbe essere tra le librerie Util e Net. – Bogolt