Intereting Posts
Как центрировать вид внутри макета Android? Кинжал 2: @ Компонент.Builder пропускает сеттеры для необходимых модулей или компонентов: ` Можно ли использовать вектор, который можно использовать так же, как я использовал 9 патчей? Запуск эмулятора Android на компьютере с процессором AMD Игра в android Непрерывная интеграция для Android через TeamCity. Предпочтительные инструменты? Фреска добавляет Bitmap в Cache программно Удалите пакеты Android SDK из командной строки Как изменить положение индикатора группы ExpandableListView? Добавление активности SDK в Qt для Android Android как получить sqlite данные по имени столбца Как я могу увидеть ошибки на console.developers.google.com? Маркер карты Google заменяется ограничивающим прямоугольником при масштабировании КоординаторLayout с панелью инструментов и фрагментом Как открыть приложение для Android с помощью кнопки facebook и twitter, которая находится в этом приложении

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) 

Solutions Collecting From Web of "Undefined ссылка на 'typeinfo для тестирования :: Test' с Google Test на Android NDK"

Я считаю, что это потому, что у вас нет поддержки 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-файл для создания вашего проекта. Я пробовал, и он отлично работает для меня. 🙂