问题
I'm trying to link to static versions of the POCO C++ libs like this:
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 this gives errors about some undefined references to symbols like:
Poco::Logger::get(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
even though Poco::Logger::get(std::string const&)
actually IS defined in libPocoFoundation.a
.
Now if I try to link to a shared version of the foundation lib it works:
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 and shared versions of the libs have the same symbols so I find it hard to figure what I'm doing wrong.
Ubuntu/Linaro. g++ 4.6.3
回答1:
My experience is that the order of linking the Poco libraries is important when statically linked. Seems important Foundation to be the last one.
The order that works for me is:
- Util
- Net
- XML
- Foundation
回答2:
I managed to solve this by separating compiling and linking. Here is what mine looks like:
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
Note that you omit the "lib" and ".a" from lib names.
来源:https://stackoverflow.com/questions/15701796/poco-c-static-linking-problems-with-undefined-references-to-symbols