OS X Mavericks 上 gtest 的链接器错误

Posted

技术标签:

【中文标题】OS X Mavericks 上 gtest 的链接器错误【英文标题】:Linker error for gtest on OS X Mavericks 【发布时间】:2013-11-08 14:18:39 【问题描述】:

我使用gtest 单元测试库已经有一段时间了。最近我设置了一台新的开发机器并升级到Mac OS X 10.9。我安装了

brew tap homebrew/versions
brew install [flags] gcc48

我在本地构建了gtest

cmake .
make

它产生了libgtest.a

我项目的第二个依赖是日志库log4cxx。我像往常一样得到它:

brew install log4cxx

一切看起来都很好。但是当我现在尝试编译时,我得到this massive linker error 关于我无法解释的未定义符号。有什么想法吗?

【问题讨论】:

【参考方案1】:

此问题与编译时使用-stdlib= 有关。我无法告诉你哪个值(libstdc++libc++)是正确的值,但它必须与库编译时使用的值相匹配。

我想您需要深入研究自制程序日志才能找到答案。

【讨论】:

我已将错误范围缩小到 log4cxx。 Homebrew 使用 clang 编译 log4cxx,而我使用 gcc-4.8 编译我的项目。这是错误的原因吗?我能做些什么来改变这种情况? @cls 是的,这就是问题所在。您应该使用 clang-stdlib=libc++ 标志来编译您的项目。 我相信 clang 不支持 OpenMP。如果这是真的,我会为我的项目使用 GCC。有没有办法将log4cxx 的编译器切换到GCC? @cls 我不使用自制软件(我更喜欢 macports),所以我不知道。不过,我希望如此。【参考方案2】:

另一个需要注意的技巧是确保您正在编译的所有内容都对您链接在一起的所有可执行单元使用相同的 -mmacosx-version-min 值。如果您不定义,则 Mavericks 将使用 10.9,并且默认情况下它似乎与 libc++ 链接,而如果您使用 -mmacosx-version-min=10.8 或更低版本,它将默认与 libstdc++ 链接。

当你通过 c++filt 运行它们时,这会给你一个不匹配的地方,你的一些符号是 std::__1::foo 和一些是 std::foo。

【讨论】:

嗯,这听起来不太对(关于使用的默认库的部分取决于指定的 -mmacosx-version-min)。 为了扩展我的最后一条评论,现代 C++ 运行时库 (libc++) 在 10.7+ 中受支持,所以我不希望您描述的行为。 "确保您正在编译的所有内容都使用相同的 -mmacosx-version-min" - 我将如何为 clang 和 gcc 执行此操作? log4cxx 好像不能用 gcc 编译,所以我的库需要使用 clang,我的项目需要使用 gcc。 ***foe:我们在将机器从 10.8 升级到 10.9 时遇到了这个问题,突然构建开始失败。我们有一个库具有“-mmacosx-version-min=10.6”,而另一个库没有“-mmacosx-version-min”设置,因此默认为 10.9。 -macosx-versions-min 设置为 10.6 的那个使用了 std::foo,而使用 10.9 的那个使用了 std::__1::foo (如here 所述) cls:我不确定你什么时候混合使用 gcc 和 clang。 clang 是否默认为 C++11?如果你把它关掉会发生什么。

以上是关于OS X Mavericks 上 gtest 的链接器错误的主要内容,如果未能解决你的问题,请参考以下文章

Aspell 不会在 OS X 10.9 (Mavericks) 上构建

如何使用自制软件在 Mac OS X 上安装 GTest?

OS X Mavericks 上支持 SSL 的虚拟主机

使 PHP 的 mail() 函数在 OS X Mavericks 上工作的分步指南

在 OS X Mavericks 10.9 上安装 apache 2.4

如何在 OS X 10.9 (Mavericks) 上使用 GDB 而不是 LLDB 调试 ELF 文件?