1

我一直在尝试将 log4cxx 链接到我的 ObjC/ObjC++/C++ 项目中。它可以编译,但由于未定义的符号,总是在链接阶段失败。通过打开 Xcode 构建选项“Display Mangled Names”,我可以看到为什么会出现这种情况。链接器正在查找的重整名称与 log4cxx.dylib 文件中的重整名称不同。

例如

"log4cxx::Logger::forcedLog(log4cxx::helpers::ObjectPtrT<log4cxx::Level> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, log4cxx::spi::LocationInfo const&) const"

变成

"__ZNK7log4cxx6Logger9forcedLogERKNS_7helpers10ObjectPtrTINS_5LevelEEERKNSt3__112basic_stringIcNS7_11char_traitsIcEENS7_9allocatorIcEEEERKNS_3spi12LocationInfoE"

从链接器的角度来看。然而,nm 在 log4cxx.dylib 中报告的最接近的符号是

__ZNK7log4cxx6Logger9forcedLogERKNS_7helpers10ObjectPtrTINS_5LevelEEERKSbIwSt11char_traitsIwESaIwEERKNS_3spi12LocationInfoE

我创建的这个库是使用 Apache 提供的 Xcode 项目创建的。

我看到之前有人问过类似的问题(How can I resolve single symbol link error when dynamic linking XCode project to lib4cxx library?),但没有有用的回应。

一个决议将不胜感激。

4

1 回答 1

3

您的 C++ 标准库设置不匹配。有些代码使用新的 libc++,有些使用 GNU 的 libstdc++。选择您想要的并更改项目设置,使其保持一致。

您可以使用 c++filt 命令行工具来解开 C++ 符号名称:

% c++filt __ZNK7log4cxx6Logger9forcedLogERKNS_7helpers10ObjectPtrTINS_5LevelEEERKNSt3__112basic_stringIcNS7_11char_traitsIcEENS7_9allocatorIcEEEERKNS_3spi12LocationInfoE
log4cxx::Logger::forcedLog(log4cxx::helpers::ObjectPtrT<log4cxx::Level> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, log4cxx::spi::LocationInfo const&) const
% c++filt __ZNK7log4cxx6Logger9forcedLogERKNS_7helpers10ObjectPtrTINS_5LevelEEERKSbIwSt11char_traitsIwESaIwEERKNS_3spi12LocationInfoE
log4cxx::Logger::forcedLog(log4cxx::helpers::ObjectPtrT<log4cxx::Level> const&, std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, log4cxx::spi::LocationInfo const&) const

注意例如std::basic_string(libstdc++) 与std::__1::basic_string(libc++)。

于 2013-05-02T21:13:19.573 回答