2013-03-29 9 views
5

Próbuję odwołuje się do wersji statycznych bibliotekami Poco C++ tak:poco C++ statyczne problemy łączenie z niezdefiniowanych odniesień do symboli

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 

Niestety to daje błędy dotyczące niektórych odniesień niezdefiniowanych symboli takich jak:

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

nawet jeśli Poco::Logger::get(std::string const&) faktycznie jest zdefiniowany w libPocoFoundation.a.

Teraz, gdy próbuję połączyć się z udostępnionym wersji fundamencie lib to działa:

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 

statyczne i współdzielone wersje bibliotekami mają takie same symbole, więc trudno mi zrozumieć, co mam robić źle.

Ubuntu/Linaro. g ++ 4.6.3

+0

ja również zdefiniowane POCO_STATIC podczas kompilacji. Nie pomogło. – gregee123

Odpowiedz

1

Udało mi się rozwiązać ten problem przez oddzielenie kompilacji i linkowania. Oto co kopalnia wygląda następująco:

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

linku: 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

pamiętać, że pomiń "lib" i ".a" z nazw bibliotek.

14

Z mojego doświadczenia wynika, że ​​kolejność łączenia bibliotek Poco jest ważna, gdy są statycznie połączone. Wygląda na ważną Fundację jako ostatnią.

Kolejność że pracuje dla mnie jest:

  1. util
  2. netto
  3. XML
  4. Fundacja
+0

Gah! Dziękuję, to było to! – Cameron

+0

Tak, statyczna kolejność łączenia z gcc jest ważna, a wewnętrzne zależności między tymi bibliotekami muszą być brane pod uwagę. To nie jest tylko problem POCO, ale ogólne zachowanie w statycznym łączeniu gcc. W tym przypadku Util zależy na XML (możesz to sprawdzić w kodzie), na przykład, a wszystkie biblioteki zależą od Foundation. Niezależne biblioteki są na pierwszym miejscu, a wymagania tych bibliotek powinny być po nich. – drodri

+2

Istnieje również PocoJSON, który powinien znajdować się między bibliotekami Util i Net. – Bogolt