c++ - 将 XCode 项目动态链接到 lib4cxx 库时,如何解决单个符号链接(symbolic link)错误?

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

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

Undefined symbols for architecture x86_64:
"log4cxx::Logger::forcedLog(log4cxx::helpers::ObjectPtrT const&, std::__1::basic_string, std::__1::allocator > const&, log4cxx::spi::LocationInfo const&) const", referenced from:

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

相关代码基本上是:

#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!

最佳答案

我将我的问题追溯到在非 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

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

关于c++ - 将 XCode 项目动态链接到 lib4cxx 库时,如何解决单个符号链接(symbolic link)错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15865826/

相关文章:

ios - Xcode6 beta4 的问题

c - 多重定义 ... 链接器错误

c++ - boost::program_options 未定义引用

c++ - 什么是 undefined reference /未解析的外部符号错误,我该如何解决?

c++ - fgetws 无法从 FILE* 中获取准确的宽字符字符串

c++ - 当我创建一个模板时,我尝试使用它但是得到一个错误(C2668)和 IntelliSense 错误

c++ - 在 MFC 窗体中围绕控件创建边框

c++ - 从源代码编译的 FreeImage。 #include FreeImage.h 未找到

swift - 防止升级用户时 CoreData 崩溃

xcode - 如何设置类范围变量?