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);
这是由于 googletest、clang 还是其他原因造成的问题吗? 我正在尝试弄清楚,但是在查看 googletest 的代码时遇到了一些麻烦。
注意
我无法为 googletest 找到未解决或已关闭的问题,因此我还要在 github 上为它打开一张票。 稍后我可能会发布该问题的链接。
【问题讨论】:
可能是 ABI 不兼容,因为您使用 gcc 构建了 gtest 并将其链接到使用 clang 编译的内容? 可能与编译错误无关,但您应该链接libgtest_main.a
或libgmock_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)的主要内容,如果未能解决你的问题,请参考以下文章
clang 插件编译错误:未定义符号 llvm::Registry<clang::PluginASTAction, llvm::RegistryTraits<clang::PluginAS