Все тесты, которые так или иначе включают <gtest/gtest.h>
а также <google/dense_hash_map>
не в состоянии построить для меня. Обычно последнее включается косвенно, но я могу воспроизвести проблему следующим образом:
#include <gtest/gtest.h>
#include <google/dense_hash_map>
TEST(SparsehashTest, justPass) {
ASSERT_TRUE(true);
};int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
Эта проблема:
In file included from /usr/include/c++/5/tr1/functional:39:0,
from /usr/local/include/sparsehash/dense_hash_map:106,
from /usr/local/include/google/dense_hash_map:34,
from /home/me/xxx/test/SparsehashTest.cpp:6:
/usr/include/c++/5/tr1/tuple:130:11: error: redefinition of ‘class std::tuple< <template-parameter-1-1> >’
class tuple : public _Tuple_impl<0, _Elements...>
^
In file included from /home/me/xxx/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:697:0,
from /home/me/xxx/third_party/googletest/googletest/include/gtest/internal/gtest-internal.h:40,
from /home/me/xxx/third_party/googletest/googletest/include/gtest/gtest.h:58,
from /home/me/xxx/test/SparsehashTest.cpp:5:
/usr/include/c++/5/tuple:463:11: error: previous definition of ‘class std::tuple< <template-parameter-1-1> >’
class tuple : public _Tuple_impl<0, _Elements...>
Таким образом, sparsehash включает в себя /usr/include/c++/5/tr1/tuple
тогда как gtest включает /usr/include/c++/5/tuple
и помещает его в пространство имен tr1 в GTEST-port.h:
...
697: #include <tuple>
698: // C++11 puts its tuple into the ::std namespace rather than
699: // ::std::tr1. gtest expects tuple to live in ::std::tr1, so put it there.
700: // This causes undefined behavior, but supported compilers react in
701: // the way we intend.
702: namespace std {
703: namespace tr1 {
704: using ::std::get;
705: using ::std::make_tuple;
706: using ::std::tuple;
707: using ::std::tuple_element;
708: using ::std::tuple_size;
709: }
...
Я могу понять, почему это вызывает проблемы, но до сих пор я не понимаю, почему это происходит только в моей настройке.
У меня гугл-sparsehash установлен регулярно (git clone
а потом ./configure && make && sudo make install
) и мой проект представляет собой проект CMake, который имеет подрежим git для googletest и строит его в виде зависимости / подпапки. Эта настройка работает, как и предполагалось, для всех тестов, которые (косвенно) не включают заголовки sparsehash.
РЕДАКТИРОВАТЬ: Так что, кажется, компилируется, если я добавлю -DGTEST_HAS_TR1_TUPLE=0 -DGTEST_USE_OWN_TR1_TUPLE=0
как флаги компилятора. Я не уверен, почему это необходимо, и если это правильно делать здесь
Я нашел этот поток, потому что у меня была та же проблема, и он предоставил достаточно подсказок, которые мне удалось исправить, попросив скомпилировать sparsehash с опцией компилятора c ++ 11:
./ configure CXXFLAGS = ‘- std = c ++ 11’
Полный набор определений изменения gtest из-за окружения показан в GTEST-port.h файл. Документация также дает вам детали конфигурации кортежа TR1.
В зависимости от вашей среды. Вы можете делать правильные вещи. Предполагается, что GoogleTest сделает обнаружение за вас, на практике я редко видел, как он работает, и я обычно определяю те же флаги, что и ваши.