我在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!
答案 0 :(得分:1)
我将我的问题追溯到在非C ++ 11编译器中编译库,但后来我的目标项目是C ++ 11编译器。
通过查看开发git仓库中log4cxx的更改,我能够在C + 11编译器中编译log4cxx,主要包括插入static_casts,如本次更新中所示:
我认为一些不兼容的例程未定义,这就是为什么我们只与几个看似随意的未定义混淆。 (或者无论如何我都是)