Я скачал googletest и построил его в подкаталоге с именем build
.
Затем я написал следующий код в файл с именем main.cpp
:GoogleTest: ошибка компиляции CLang ASSERT_FALSE (false)
#include <gtest/gtest.h>
TEST(FOO, BAR) { ASSERT_FALSE(false); }
Довольно просто на самом деле.
Он полагается на то, что функция main
уже представлена googletest, если вы связываете библиотеку libgtestmain.a
.
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
Во всяком случае, лязг (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: In function 'FOO_BAR_Test::TestBody()':
main.cpp:(.text+0x7b): undefined reference to `testing::internal::GetBoolAssertionFailureMessage(testing::AssertionResult const&, char const*, char const*, char const*)'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
код содержит почти единственный ASSERT_FALSE(false)
заявление (это мин imal, полный пример и до сих пор он не компилируется), поэтому я бы сказал, что проблема не в самом коде.
Та же проблема возникает также из следующего утверждения:
TEST(FOO, BAR) { ASSERT_TRUE(true); }
Это проблема из-за googletest, чтобы лязгом или что-то?
Я пытаюсь понять это, но я немного в беде, глядя на код googletest.
ПРИМЕЧАНИЕ
Я не смог найти ни открытым, ни закрытый вопрос для googletest, поэтому я, чтобы открыть и билет на него на GitHub.
Через некоторое время я, вероятно, опубликую ссылку на эту проблему.
Возможно, это несовместимость ABI, потому что вы создали gtest, используя gcc, и вы связываете его с чем-то, что скомпилировано с clang? – galsh83
Вероятно, не связано с ошибкой компиляции, но вы должны ссылаться на 'libgtest_main.a' или' libgmock_main.a', а не на оба. –