POCO C++静态链接问题:未定义符号的引用

6
我正在尝试链接静态版本的POCO C++库,方法如下:
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

很不幸,这会产生一些未定义符号的错误,例如:

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

即使Poco::Logger::get(std::string const&)实际上在libPocoFoundation.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

静态库和共享库版本具有相同的符号,因此我很难弄清楚我做错了什么。

Ubuntu/Linaro。g++ 4.6.3


我在编译时也定义了POCO_STATIC,但没有起作用。 - gregee123
2个回答

18

我的经验是,在静态链接时链接Poco库的顺序很重要。似乎Foundation库应该是最后一个。

对我有效的顺序是:

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

该!谢谢,就是这个! - Cameron
是的,使用gcc进行静态链接的顺序很重要,并且必须考虑这些库之间的内部依赖关系。这不仅仅是一个POCO问题,而是gcc静态链接中的一般行为。在这种情况下,Util依赖于XML(您可以在代码中查看),所有的库都依赖于Foundation。独立的库首先出现,而这些库的需求应该在它们之后。 - drodri
3
还有PocoJSON,应该放在Util和Net库之间。 - Bogolt

1
我通过分离编译和链接来解决了这个问题。下面是我的代码:
编译: g++ -c -std=c++0x -ggdb -I/home/bbogart/src/of_v0071_linux64_release/libs/poco/includepkg-config opencv --cflags*.cpp 链接: g++ *.o -L/home/bbogart/src/of_v0071_linux64_release/libs/poco/lib/linux64/ -lPocoNet -lPocoUtil -lPocoFoundation -lopencv_gpupkg-config opencv --libs-o cameraGrabber 请注意,您需要省略 lib 名称中的 "lib" 和 ".a"。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接