Undefined ссылка на 'typeinfo для тестирования :: Test' с Google Test на Android NDK

Я пытаюсь использовать Google Test с Android NDK. Следуя примеру NDK README , я установил свой Android.mk и один тест, как показано ниже, но я получаю эту ошибку:

./obj/local/armeabi/objs-debug/ndkfoo_unittest/FilteredPriorityQueue_test.o:FilteredPriorityQueue_test.cpp:function typeinfo for mashbot::FilteredPriorityQueueTest_ShouldRetrieveTop_Test: error: undefined reference to 'typeinfo for testing::Test' collect2: error: ld returned 1 exit status make: *** [obj/local/armeabi/ndkfoo_unittest] Error 1 

Вот что я знаю до сих пор:

  • ::testing::Test – это класс Google Test, автоматически подклассифицированный макросом TEST() .
  • undefined reference to 'typeinfo for ошибок» обычно возникает, когда компоновщик не может найти определение для виртуального метода.
  • Может быть вызвано компиляцией теста google с разными флагами , но здесь не должно быть так, поскольку я использую статическую тестовую библиотеку google и флаги одинаковы между этими двумя модулями.

Что мне не хватает? Или где я могу смотреть дальше? Благодаря!

Update: Я могу создать простой тест Google, который не зависит от чего-либо вроде Boost или родной apis для Android, если я удалю SHARED_LIBRARIES, CPP_FLAGS и LDLIBS из модуля ndkfoo_unittest.

Команда сборки:

 ndk-build SHELL=/bin/bash NDK_DEBUG=1 

FilteredPriorityQueue_test.cpp:

 #include "gtest/gtest.h" // FilteredPriorityQueue is a header-only file with no virtual methods. #include "FilteredPriorityQueue.h" // So is Comparator. #include "Comparator.h" struct MaskedObject { int mMask; MaskedObject(int mask) : mMask(mask) { } int getMask() const { return mMask; } bool operator<(const MaskedObject& rhs) const { return this->mMask < rhs.mMask; } }; typedef FilteredPriorityQueue<int, MaskedObject, Comparator<MaskedObject> > TestQueue; TEST(FilteredPriorityQueueTest,ShouldRetrieveTop) { Comparator<MaskedObject> comparator(Comparator<MaskedObject>::LESS); TestQueue q(comparator); q.push(1, MaskedObject(1)); q.push(2, MaskedObject(2)); q.push(4, MaskedObject(4)); EXPECT_EQ( 1, q.top().getMask() ); } 

Android.mk:

 # ndkfoo module #------------------------- LOCAL_MODULE := ndkfoo LOCAL_CPPFLAGS := -frtti -pthread -fexceptions -std=c++11 LOCAL_LDLIBS += -lOpenSLES -llog -landroid LOCAL_C_INCLUDES += $(LIBMASHBOT_ROOT)/include LOCAL_C_INCLUDES += $(BOOST_INCLUDE_PARENT) LOCAL_SHARED_LIBRARIES += mashbot \ gnustl_shared \ boost_thread-gcc-mt-1_53 \ boost_system-gcc-mt-1_53 \ $(BOOST_LIB) LOCAL_SRC_FILES := ndkfoo.cpp \ #...more files... include $(BUILD_SHARED_LIBRARY) # ndkfoo tests module #------------------------- include $(CLEAR_VARS) LOCAL_MODULE := ndkfoo_unittest LOCAL_CPPFLAGS := -frtti -pthread -fexceptions -std=c++11 LOCAL_C_INCLUDES += $(BOOST_INCLUDE_PARENT) LOCAL_STATIC_LIBRARIES := googletest_main LOCAL_SHARED_LIBRARIES += ndkfoo \ gnustl_shared \ $(BOOST_LIB) LOCAL_SRC_FILES := FilteredPriorityQueue_test.cpp include $(BUILD_EXECUTABLE) # this imports $NDK/sources/third_party/googletest/Android.mk $(call import-module,third_party/googletest) 

Я считаю, что это потому, что у вас нет поддержки RTTI. Попробуйте добавить

 APP_CPPFLAGS += -fexceptions APP_CPPFLAGS += -frtti 

К Application.mk. Это решило это для меня. Согласно документации, вы должны иметь возможность указать

 LOCAL_CPP_FEATURES := rtti exceptions 

В Android.mk, но это не сработало для меня, используя NDK r10c. Также обратите внимание, что включение исключений не является обязательным для включения RTTI, но код, который использует RTTI, должен будет ссылаться на стандартную библиотеку, поддерживающую RTTI, а библиотеки с RTTI также поддерживают исключения.

Хорошо, если вы хотите предложить … просто делайте все просто. В случае, если вам действительно нужно сделать тест на родном коде C ++ с помощью теста google, сделайте это сначала как тест Google для рабочего стола.

До сих пор я могу сказать, по-видимому, это пока еще не совсем функционально – по крайней мере, я не нашел ни одного достойного материала или учебника, показывающего, что он действительно работает для любого реального проекта.

Теперь вы можете использовать JUnit с JNI для тестирования вашего C ++, встроенного в ваше устройство. Так будет работать. Надеюсь, в будущем google-тест действительно будет работать на Android NDK.

Здесь вы найдете дальнейшее обсуждение этого вопроса: Unit Tests with NDK .

Я встречаюсь с вами с той же проблемой. Джам прав, это из-за RTTI. Чтобы он работал, вам также нужно создать свой libgtest.a с включенным RTTI. Вы можете добавить LOCAL_CFLAGS: = -fexceptions -frtti в Android.MK для gtest и перестроить файл .a. Затем используйте новый .a-файл для создания вашего проекта. Я пробовал, и он отлично работает для меня. 🙂