2016-05-19 2 views
1

Я скачал 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.
Через некоторое время я, вероятно, опубликую ссылку на эту проблему.

+1

Возможно, это несовместимость ABI, потому что вы создали gtest, используя gcc, и вы связываете его с чем-то, что скомпилировано с clang? – galsh83

+0

Вероятно, не связано с ошибкой компиляции, но вы должны ссылаться на 'libgtest_main.a' или' libgmock_main.a', а не на оба. –

ответ

2

Начиная с GCC 5.1, g ++ не совместим с ABI с clang ++. Some Сообщения об ошибках: 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, построенными с использованием того же компилятора.