GoogleTest:CLang 错误编译 ASSERT_FALSE(false)

Posted

技术标签:

【中文标题】GoogleTest:CLang 错误编译 ASSERT_FALSE(false)【英文标题】:GoogleTest: CLang error compiling ASSERT_FALSE(false) 【发布时间】:2016-05-19 10:52:11 【问题描述】:

我下载了googletest 并将其构建在一个名为build 的子目录中。 然后,我在一个名为main.cpp的文件中编写了以下代码:

#include <gtest/gtest.h>
TEST(FOO, BAR)  ASSERT_FALSE(false); 

确实很简单。 如果您链接 libgtestmain.a 库,则它依赖于 googletest 已经提供了 main 函数这一事实。

GCC (v5.3.1) 使用以下命令对其进行编译:

g++ -L./googletest/build/googlemock/gtest -L./googletest/build/googlemock -I./googletest/googletest/include/ -lgmock -lgtest -lgtest_main -lgmock_main -pthread -std=c++11 main.cpp

无论如何,clang (v3.6.2) 不能使用相同的命令进行编译:

clang++ -L./googletest/build/googlemock/gtest -L./googletest/build/googlemock -I./googletest/googletest/include/ -lgmock -lgtest -lgtest_main -lgmock_main -pthread -std=c++11 main.cpp

错误如下:

/tmp/main-4127ae.o:在函数“FOO_BAR_Test::TestBody()”中: main.cpp:(.text+0x7b): 未定义引用`testing::internal::GetBoolAssertionFailureMessage(testing::AssertionResult const&, char const*, char const*, char const*)' clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)

代码几乎包含唯一的 ASSERT_FALSE(false) 语句(这是一个最小的完整示例,但仍然无法编译),所以我想说问题不在于代码本身。 同样的问题也出现在下面的陈述中:

TEST(FOO, BAR)  ASSERT_TRUE(true); 

这是由于 googletestclang 还是其他原因造成的问题吗? 我正在尝试弄清楚,但是在查看 googletest 的代码时遇到了一些麻烦。

注意

我无法为 googletest 找到未解决或已关闭的问题,因此我还要在 github 上为它打开一张票。 稍后我可能会发布该问题的链接。

【问题讨论】:

可能是 ABI 不兼容,因为您使用 gcc 构建了 gtest 并将其链接到使用 clang 编译的内容? 可能与编译错误无关,但您应该链接libgtest_main.alibgmock_main.a,而不是两者。 【参考方案1】:

从 GCC 5.1 开始,g++ 与 clang++ 不兼容 ABI。一些 错误报告:clang++ no longer ABI-compatible with g++ 和Add support for gcc's attribute abi_tag (needed for compatibility with gcc 5's libstdc++)。

在解决此问题之前,您需要链接 googletest-ing 项目 使用相同编译器构建的 googletest 库。

【讨论】:

以上是关于GoogleTest:CLang 错误编译 ASSERT_FALSE(false)的主要内容,如果未能解决你的问题,请参考以下文章

用GoogleTest库编译程序失败,由柯南安装。

mac 使用gcc 为啥编译错误是clang 提示

clang 插件编译错误:未定义符号 llvm::Registry<clang::PluginASTAction, llvm::RegistryTraits<clang::PluginAS

将异常规范松散错误视为警告的 Clang 编译器选项

为啥 memset 在苹果 clang 编译器中工作错误?

为 HTML 5 编译 Minko 引擎 SDK 时出现 clang++ 错误