poco c++ static linking problems with undefined references to symbols
Asked Answered
C

2

6

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

Capeskin answered 29/3, 2013 at 10:50 Comment(1)
I also defined POCO_STATIC while compiling. Didn't help.Capeskin
J
18

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:

  1. Util
  2. Net
  3. XML
  4. Foundation
Jacintajacinth answered 15/10, 2013 at 9:31 Comment(2)
Yes, static linking order with gcc is important, and the internal dependencies between those libs must be taken into account. It is not just a POCO issue, but a general behavior in gcc static linking. In this case Util depends on XML (you can check it in the code), for example, and all libs depend on Foundation. Independent libs come first, and the requirements of those libs should be after them.Opiumism
Also there is PocoJSON which should be between Util and Net libraries.Ralleigh
B
1

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/includepkg-config opencv --cflags*.cpp

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

Note that you omit the "lib" and ".a" from lib names.

Bors answered 1/8, 2013 at 20:2 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.