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/利纳罗。g++ 4.6.3

4

2 回答 2

18

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

对我有用的顺序是:

  1. 实用程序
  2. XML
  3. 基础
于 2013-10-15T09:31:04.653 回答
1

我设法通过分离编译和链接来解决这个问题。这是我的样子:

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

链接: 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

请注意,您从 lib 名称中省略了“lib”和“.a”。

于 2013-08-01T20:02:02.197 回答