【问题标题】:How can I resolve single symbol link error when dynamically linking XCode project to lib4cxx library?将 XCode 项目动态链接到 lib4cxx 库时,如何解决单符号链接错误?
【发布时间】:2013-03-29 18:02:00
【问题描述】:

我在 Mountain Lion 上使用 XCode 4.6 下的 C++ 编写代码。我正在尝试添加和使用 Apache log4cxx 库。我今天早上通过 Brew 安装了库。我正在链接 liblog4cxx.dylib。我收到一个链接错误,找不到一个符号:

架构 x86_64 的未定义符号:
"log4cxx::Logger::forcedLog(log4cxx::helpers::ObjectPtrT const&, std::__1::basic_string, std::__1::allocator > const&, log4cxx::spi::LocationInfo const&) const",引用自:

我知道它正在查找库文件,因为如果我删除它,我会收到更多与 log4cxx 相关的未定义符号错误。

相关代码基本上是:

#include <log4cxx/logger.h>

static LoggerPtr  logger(log4cxx::Logger::getLogger("foo.bar.Baz"));

void foo(int p1, int p2)
{
    LOG4CXX_WARN(logger, "blah blah blah");
}

在函数内部创建记录器对象,无论是静态的还是非静态的,都不会改变行为。此外,与静态库链接,无论是否在我的项目中定义 LOG4CXX_STATIC,都不会改变行为。

查看我正在调用的宏,我看到这个符号是执行日志操作的实际方法。如果取出日志记录调用,但保留定义记录器对象的代码,则代码链接正常,如您所料。

我需要做什么才能解析最后一个符号?

TIA!

【问题讨论】:

  • 先试试nm -g liblog4cxx.dylib,看看符号是否导出。如果不是,那么 logger 的分发可能有问题。尝试自己构建liblog4cxx.dylib
  • 我遇到了同样的问题。我看到未定义的符号列为:“log4cxx::Logger::forcedLog(log4cxx::helpers::ObjectPtrT<:level> const&, std::__1::basic_string, std::__1::allocator > const&, log4cxx::spi::LocationInfo const&) const" 我会注意到我在 32 位环境中工作,但我构建了通用 dy​​lib。无论如何,如果我执行 nm -g 我会看到:“__ZNK7log4cxx6Logger11forcedLogLSERKNS_7helpers10ObjectPtrTINS_5LevelEEERKSsRKNS_3spi12LocationInfoE”这让我相信它就在那里。有什么建议吗?

标签: c++ xcode linker-errors undefined-symbol log4cxx


【解决方案1】:

我将问题追溯到在非 C++11 编译器中编译库,但后来我的目标项目是 C++11 编译器。

通过查看开发 git repo 中 log4cxx 的更改,我能够在 C+11 编译器中编译 log4cxx,主要包括插入 static_casts,如本次更新:

http://apache-logging.6191.n7.nabble.com/C-11-does-not-allow-char-literals-with-highest-bit-set-unless-cast-td34908.html

我想少数不兼容的例程是未定义的,这就是为什么我们对只有少数看似随机的未定义感到困惑。 (或者反正我是)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多