【问题标题】:poco c++ static linking problems with undefined references to symbolspoco c++ 静态链接问题与未定义的符号引用
【发布时间】:2013-03-20 01:39:27
【问题描述】:

我正在尝试像这样链接到 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&amp;) 实际上是在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。没有帮助。

标签: c++ static-linking poco-libraries


【解决方案1】:

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

适合我的顺序是:

  1. 实用
  2. 网络
  3. XML
  4. 基础

【讨论】:

  • 啊!谢谢,就是这样!
  • 是的,gcc 的静态链接顺序很重要,必须考虑这些库之间的内部依赖关系。这不仅仅是 POCO 问题,而是 gcc 静态链接中的一般行为。例如,在这种情况下,Util 依赖于 XML(您可以在代码中检查它),并且所有库都依赖于 Foundation。独立的库在前,这些库的需求应该在它们之后。
  • 还有 PocoJSON 应该在 Util 和 Net 库之间。
【解决方案2】:

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

编译: 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”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多