在将XCode项目动态链接到lib4cxx库时,如何解决单符号链接错误?

时间:2013-04-07 18:01:36

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

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

  

架构x86_64的未定义符号:
  " log4cxx ::记录器:: forcedLog(log4cxx ::助手:: 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");
}

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

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

如果要解决此最后一个符号,我需要做什么?

TIA!

1 个答案:

答案 0 :(得分:1)

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

通过查看开发git仓库中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

我认为一些不兼容的例程未定义,这就是为什么我们只与几个看似随意的未定义混淆。 (或者无论如何我都是)