ndk-build: неопределенная ссылка на .. ошибки при статической ссылке на libxml.a - PullRequest
11 голосов
/ 27 августа 2011

Я получаю много неопределенных ссылок на ... ошибки, когда я компилирую свой единственный исходный файл c ++ с помощью инструмента ndk-build.Для записи я использую NDK r6 в хост-системе linux.

Прежде всего, я весь день мучился с этой проблемой, поэтому мне жаль, если я что-то упускаю или немного объясняю себябыстро.Пожалуйста, запросите у меня дополнительную информацию.

В моем исходном коде много зависимых библиотек, на которые я хочу статически ссылаться.Я определил все мои зависимые библиотеки разных в моем файле Android.mk следующим образом:

include $(CLEAR_VARS)

LOCAL_MODULE    := <name>
LOCAL_SRC_FILES := lib<name>.a
LOCAL_EXPORT_C_INCLUDES := <header files related to this lib>

include $(PREBUILT_STATIC_LIBRARY)

Пока я удостоверяюсь, что они доступны в моей папке jni / как lib.a с моим Android.mk иФайлы Application.mk.(и мой исходный файл) Также я добавил поддержку STL, добавив APP_STL := stlport_static в мой файл Application.mk.Мой единственный исходный файл (riidr-jni.cpp) в данный момент:

#include <string>
#include <jni.h>
#include <android/log.h>
#include "../com_riidr_apps_reader_RiidrEbookReaderActivity.h"
#include <dp_all.h>

void Java_com_riidr_apps_reader_RiidrEbookReaderActivity_init ( JNIEnv* env, jobject thiz ) {
    __android_log_write(ANDROID_LOG_INFO, "Riidr", "JNI init - start");
    dp::platformInit( dp::PI_DEFAULT );
}

Если я раскомментирую строку dp::platformInit( dp::PI_DEFAULT ); и заменю ее на std::string test = "asd"; У меня вообще нет ошибок, это заставляет меняполагайте, что и, следовательно, библиотека STL правильно импортирована и связана.

Последними инструкциями моего файла Android.mk являются следующие:

include $(CLEAR_VARS)

LOCAL_MODULE    := riidr-jni
LOCAL_SRC_FILES := riidr-jni.cpp
LOCAL_LDLIBS := -llog -ldl -lz
LOCAL_STATIC_LIBRARIES :=  \
hobbes \
dp \
adept \
mschema \
hobbes \
t3 \
xml \
mschema \
dp \
adept \
xml \
cryptopenssl \
fonts \
png \
jpeg \
ssl \
crypto \
expat \
cts \
hyphen \
curl

include $(BUILD_SHARED_LIBRARY)

Ошибка, которую я получаю при запуске инструмента ndk-buildимеет следующий вид:

/ home / creen / Projects / Riidr / рабочая область / RiidrEbookReader / obj / local / armeabi / libxml.a (xpath_context.o): в функции std::_Rb_tree_iterator<std::pair<uft::Value const, xpath::DynamicContext*> >::operator++()': xpath_context.cpp:(.text._ZNSt17_Rb_tree_iteratorISt4pairIKN3uft5ValueEPN5xpath14DynamicContextEEEppEv[std::_Rb_tree_iterator<std::pair<uft::Value const, xpath::DynamicContext*> >::operator++()]+0x1c): undefined reference to std :: _ Rb_tree_increment(std :: _ Rb_tree_node_base *) '/home/creen/Projects/Riidr/workspace/RiidrEbookReader/obj/local/armeabi/libxml.a(xpath_context.o): в функции std::_Rb_tree<uft::Value, std::pair<uft::Value const, xpath::DynamicContext*>, std::_Select1st<std::pair<uft::Value const, xpath::DynamicContext*> >, xpath::Context::ValueCompare, std::allocator<std::pair<uft::Value const, xpath::DynamicContext*> > >::erase(std::_Rb_tree_iterator<std::pair<uft::Value const, xpath::DynamicContext*> >)': xpath_context.cpp:(.text._ZNSt8_Rb_treeIN3uft5ValueESt4pairIKS1_PN5xpath14DynamicContextEESt10_Select1stIS7_ENS4_7Context12ValueCompareESaIS7_EE5eraseESt17_Rb_tree_iteratorIS7_E[std::_Rb_tree<uft::Value, std::pair<uft::Value const, xpath::DynamicContext*>, std::_Select1st<std::pair<uft::Value const, xpath::DynamicContext*> >, xpath::Context::ValueCompare, std::allocator<std::pair<uft::Value const, xpath::DynamicContext*> > >::erase(std::_Rb_tree_iterator<std::pair<uft::Value const, xpath::DynamicContext*> >)]+0x28): undefined reference to std :: _ Rb_tree_reb*, std :: _ Rb_tree_node_base &) '/home/creen/Projects/Riidr/workspace/RiidrEbookReader/obj/local/armeabi/libxml.a(xpath_context.o): в функции std::_Rb_tree<uft::Value, std::pair<uft::Value const, xpath::DynamicContext*>, std::_Select1st<std::pair<uft::Value const, xpath::DynamicContext*> >, xpath::Context::ValueCompare, std::allocator<std::pair<uft::Value const, xpath::DynamicContext*> > >::_M_insert_(std::_Rb_tree_node_base const*, std::_Rb_tree_node_base const*, std::pair<uft::Value const, xpath::DynamicContext*> const&)': xpath_context.cpp:(.text._ZNSt8_Rb_treeIN3uft5ValueESt4pairIKS1_PN5xpath14DynamicContextEESt10_Select1stIS7_ENS4_7Context12ValueCompareESaIS7_EE10_M_insert_EPKSt18_Rb_tree_node_baseSG_RKS7_[std::_Rb_tree<uft::Value, std::pair<uft::Value const, xpath::DynamicContext*>, std::_Select1st<std::pair<uft::Value const, xpath::DynamicContext*> >, xpath::Context::ValueCompare, std::allocator<std::pair<uft::Value const, xpath::DynamicContext*> > >::_M_insert_(std::_Rb_tree_node_base const*, std::_Rb_tree_node_base const*, std::pair<uft::Value const, xpath::DynamicContext*> const&)]+0xc4): undefined reference to std :: _ Rb_tre_alse:: _Rb_tree_node_base *, std :: _ Rb_tree_node_base *, std ::_Rb_tree_node_base &) '/home/creen/Projects/Riidr/workspace/RiidrEbookReader/obj/local/armeabi/libxml.a(xpath_context.o): в функции std::_Rb_tree_const_iterator<std::pair<uft::Value const, xpath::DynamicContext*> >::operator--()': xpath_context.cpp:(.text._ZNSt23_Rb_tree_const_iteratorISt4pairIKN3uft5ValueEPN5xpath14DynamicContextEEEmmEv[std::_Rb_tree_const_iterator<std::pair<uft::Value const, xpath::DynamicContext*> >::operator--()]+0x1c): undefined reference to std :: _ Rb_tree_decrebhome / creen / Projects / Riidr / рабочая область / RiidrEbookReader / obj / local / armeabi / libxml.a (xpath_context.o): в функции std::_Rb_tree_const_iterator<std::pair<uft::Value const, xpath::DynamicContext*> >::operator++()': xpath_context.cpp:(.text._ZNSt23_Rb_tree_const_iteratorISt4pairIKN3uft5ValueEPN5xpath14DynamicContextEEEppEv[std::_Rb_tree_const_iterator<std::pair<uft::Value const, xpath::DynamicContext*> >::operator++()]+0x1c): undefined reference to std :: _ Rb_tree_increment (std :: _ Rb_tree_node_base const *) '/ homeПроекты / Riidr / workspace / RiidrEbookReader / obj / local / armeabi / libxml.a (xpath_context.o): в функции __gnu_cxx::new_allocator<mdom::Node*>::allocate(unsigned int, void const*)': xpath_context.cpp:(.text._ZN9__gnu_cxx13new_allocatorIPN4mdom4NodeEE8allocateEjPKv[__gnu_cxx::new_allocator<mdom::Node*>::allocate(unsigned int, void const*)]+0x4c): undefined reference to std :: __ throw_bad_alloc () '/ home / creen / Projects / Riidr / workspace / RiidrEbookReader / objlocal / armeabi / libxml.a (xpath_context.o): в функции __gnu_cxx::new_allocator<mdom::Node>::allocate(unsigned int, void const*)': xpath_context.cpp:(.text._ZN9__gnu_cxx13new_allocatorIN4mdom4NodeEE8allocateEjPKv[__gnu_cxx::new_allocator<mdom::Node>::allocate(unsigned int, void const*)]+0x4c): undefined reference to std :: __ throw_bad_alloc () '/home/creen/Projects/Riidr/workspace/RiidrEbookReader/obj/local/armeabi/libxml.a(xpath_o): В функции std::_Rb_tree_iterator<std::pair<uft::Value const, xpath::DynamicContext*> >::operator--()': xpath_context.cpp:(.text._ZNSt17_Rb_tree_iteratorISt4pairIKN3uft5ValueEPN5xpath14DynamicContextEEEmmEv[std::_Rb_tree_iterator<std::pair<uft::Value const, xpath::DynamicContext*> >::operator--()]+0x1c): undefined reference to std :: _ Rb_tree_decrement (std :: _ Rb_tree_node_base *) '/home/creen/Projects/Riidr/workspace/RiidrEbookReader/obj/local/armeabi/libxml.a(xpath_context.context.std::deque<mdom::Node, std::allocator<mdom::Node> >::_M_new_elements_at_front(unsigned int)': xpath_context.cpp:(.text._ZNSt5dequeIN4mdom4NodeESaIS1_EE24_M_new_elements_at_frontEj[std::deque<mdom::Node, std::allocator<mdom::Node> >::_M_new_elements_at_front(unsigned int)]+0x58): undefined reference to std :: __ throw_length_error (char const *) '/ home / creen / Projects / Riidr / workspace / RiidrEbookReader / obj / local / armeabi / libxml.a (xpath_context.o): в функции std::deque<mdom::Node, std::allocator<mdom::Node> >::_M_new_elements_at_back(unsigned int)': xpath_context.cpp:(.text._ZNSt5dequeIN4mdom4NodeESaIS1_EE23_M_new_elements_at_backEj[std::deque<mdom::Node, std::allocator<mdom::Node> >::_M_new_elements_at_back(unsigned int)]+0x58): undefined reference to std :: __ throw_length_error (char const *) '/ home / creen / Projects / Riidr / workspace / RiidrEbookRe/obj/local/armeabi/libxml.a(xpath_context.o): в функции __gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<uft::Value const, xpath::DynamicContext*> > >::allocate(unsigned int, void const*)': xpath_context.cpp:(.text._ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKN3uft5ValueEPN5xpath14DynamicContextEEEE8allocateEjPKv[__gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<uft::Value const, xpath::DynamicContext*> > >::allocate(unsigned int, void const*)]+0x4c): undefined reference to std :: __ throw_bad_alloc () '/home/creen/Projects/Riidr/workspace/RiidrEbookReader/obj/local/armeabi/libxa.(xpath_yacc.o): в функции std::list<uft::Value*, std::allocator<uft::Value*> >::_M_insert(std::_List_iterator<uft::Value*>, uft::Value* const&)': xpath_yacc.cpp:(.text._ZNSt4listIPN3uft5ValueESaIS2_EE9_M_insertESt14_List_iteratorIS2_ERKS2_[std::list<uft::Value*, std::allocator<uft::Value*> >::_M_insert(std::_List_iterator<uft::Value*>, uft::Value* const&)]+0x3c): undefined reference to std :: _ List_node_base :: hook (std :: _ List_node_base *) '/home/creen/Projects/Riidr/workspace/RiidrEbookReader/obj/local/armeabi/libxml.a(xpath_.o): в функции __gnu_cxx::new_allocator<std::_List_node<uft::Value*> >::allocate(unsigned int, void const*)': xpath_yacc.cpp:(.text._ZN9__gnu_cxx13new_allocatorISt10_List_nodeIPN3uft5ValueEEE8allocateEjPKv[__gnu_cxx::new_allocator<std::_List_node<uft::Value*> >::allocate(unsigned int, void const*)]+0x4c): undefined reference to std :: __ throw_bad_alloc () 'collect2: ld вернул 1 состояние выхода make: * [/ home / creen / Projects / Riidr / workspace / RiidrEbookReader / obj / local /armeabi / libriidr-jni.so] Ошибка 1

Любая информация, вопросы или что-либо действительно высоко ценится.

Ответы [ 5 ]

31 голосов
/ 12 сентября 2011

Добавьте строку

LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

в файл Android.mk, и она должна работать.Как объясняется в документе ndk, это связано с тем, что ndk выполняет проверку отладки даже во избежание ошибки компоновки во время выполнения и по некоторым причинам не находит правильных ссылок в предварительно собранной библиотеке.Надеюсь, что это может помочь.

3 голосов
/ 27 августа 2011

Вы должны были добавить APP_STL := stlport_static в файл Application.mk, а не Android.mk.

РЕДАКТИРОВАТЬ : Насколько я вижу, вы не связывались со статическим stlportбиблиотека.Поэтому я думаю, что вы должны добавить что-то вроде -lstlport к LOCAL_LDLIBS.

2 голосов
/ 02 ноября 2012

Как уже упоминали другие,

LOCAL_ALLOW_UNDEFINED_SYMBOLS: = true

не будет работать во время выполнения. Посмотрите на это:

https://github.com/MysticTreeGames/Boost-for-Android

Я столкнулся с той же проблемой с boost (я использую кастомную версию 1.42).

Использование метода грубой силы для настройки gnustdc ++ решило мою проблему. Важно, чтобы ссылки на -lgnustl_static (или любой другой используемый вами stl lib) были связаны с вашими библиотеками.

0 голосов
/ 11 сентября 2016

Проблема в том, что некоторые функции включены по умолчанию, хотя им может потребоваться дополнительная связь с другими библиотеками. Это следующие функции: - Поддержка загрузки модовой музыки через modplug. - поддержка загрузки модовой музыки через микмод - поддержка загрузки музыки в формате MP3 через SMPEG Вы должны отключить эти опции для сборки sdl2_mixer, поэтому перейдите в файл "Android.mk" (из SDL2_mixer), и вы найдете:

SUPPORT_MOD_MODPLUG ?= true
...
SUPPORT_MOD_MIKMOD ?= true
...
SUPPORT_MP3_SMPEG ?= true

поменяйте их на "ложь", и это сработает для вас, как и у меня!

ПРИМЕЧАНИЯ:

 LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

1- вызовет ошибку во время выполнения, поскольку символ все еще не будет разрешен во время выполнения

2 - Вы не сможете загружать mp3-файлы, но вы можете преобразовать их в «ogg» с почти одинаковым размером и качеством, но вы можете найти идеальное решение вашей проблемы здесь Ошибка связывания во время выполнения с SDL_Mixer и SMPEG2 на Android

0 голосов
/ 28 октября 2012

Вы смотрели на ошибку # 16627?

http://code.google.com/p/android/issues/detail?id=16627

Я использую ndk-r8, но у меня все еще есть эти ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...