2016-07-08 3 views
1

В настоящее время я пытаюсь создать статическую библиотеку некоторых исходных файлов C++, требующих повышения. Я следовал за hello-libs примером и успешно соединил подталкивании статических зависимости файл, как это делается в образце example.Now сказал, что во время строительства, а модуля я получаю эту erros:Android NDK linker Ошибка: ошибка: неопределенная ссылка на std :: basic_string

Error:error: undefined reference to 'std::basic_string, std::allocator >::basic_string(char const*, std::allocator const&)'

Error:error: undefined reference to 'std::runtime_error::runtime_error(std::string const&)'

Error:error: undefined reference to 'std::_Rb_tree_decrement(std::_Rb_tree_node_base*)'

Error:error: undefined reference to 'std::string::_Rep::_S_empty_rep_storage'

Error:error: undefined reference to 'std::basic_string, std::allocator >::~basic_string()'

Error:error: undefined reference to 'std::string::_Rep::_M_dispose(std::allocator const&)'

Error:error: undefined reference to 'std::runtime_error::runtime_error(std::string const&)'

Error:error: undefined reference to 'std::string::_Rep::_M_destroy(std::allocator const&)'

Error:error: undefined reference to 'std::basic_string, std::allocator >::basic_string(std::string const&)'

Error:error: undefined reference to 'std::_Rb_tree_increment(std::_Rb_tree_node_base*)'

Error:error: undefined reference to 'std::string::_Rep::_S_empty_rep_storage'

Error:error: undefined reference to 'std::string::_Rep::_M_destroy(std::allocator const&)'

Error:error: undefined reference to 'std::basic_string, std::allocator >::basic_string(std::string const&)'

Error:error: undefined reference to 'std::string::_Rep::_M_destroy(std::allocator const&)'

Error:error: undefined reference to 'std::_Rb_tree_increment(std::_Rb_tree_node_base const*)'

Error:error: undefined reference to 'std::_Rb_tree_rebalance_for_erase(std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)'

Error:error: undefined reference to 'std::string::_Rep::_S_empty_rep_storage'

Error:error: undefined reference to 'std::string::_Rep::_S_empty_rep_storage'

Error:error: undefined reference to 'std::basic_string, std::allocator >::basic_string(char const*, std::allocator const&)'

Error:error: undefined reference to 'std::basic_string, std::allocator >::basic_string(std::string const&)'

Error:error: linker command failed with exit code 1 (use -v to see invocation)

Error:error: undefined reference to 'std::basic_string, std::allocator >::basic_string(char const*, std::allocator const&)'

Error:error: undefined reference to 'std::string::_Rep::_M_destroy(std::allocator const&)'

Error:error: undefined reference to 'std::_Rb_tree_rebalance_for_erase(std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)'

Error:error: undefined reference to 'std::string::_Rep::_M_dispose(std::allocator const&)'

Error:error: undefined reference to 'std::basic_string, std::allocator >::basic_string(char const*, std::allocator const&)'

Error:error: undefined reference to 'std::_Rb_tree_insert_and_rebalance(bool, std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)'

Error:Execution failed for task ':dummy:linkDummyArmeabiDebugSharedLibrary'.

A build operation failed. Linker failed while linking libdummy.so. See the complete log at: file:///home/cran-cg/Downloads/Hello-libs-boost/name/build/tmp/linkDummyArmeabiDebugSharedLibrary/output.txt

я пытался решить эту проблему и натолкнулись на многих решений на StackOverflow себя, предполагая, что я должен изменить свой путь компоновщика и включают в себя LibC++. поэтому библиотека

ndk{ 
     moduleName = 'p2psp' 
     stl = "c++_shared" 
     // ldLibs.addAll('-L'+ file("/home/cran-cg/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/armeabi").absolutePath) 
     ldLibs.addAll(['android', 'log','atomic'])/*"${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi",'gnustl_static'*/ 
     toolchain = "clang" 
     cppFlags.add("-std=c++11") 
     cppFlags.add('-frtti') 
     cppFlags.add('-fexceptions') 
     cppFlags.addAll('-I' + file("/home/cran-cg/Android/Sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/libcxx/include").absolutePath ,'-DANDROID', ' -DANDROID_NDK', '-DAWS_CUSTOM_MEMORY_MANAGEMENT', '-fPIC', '-fexceptions') 
     //cppFlags.add("-I${lib_distribution_root}/boost/include".toString()) 
     //cppFlags.add("-I${file("src/main/jni/inc")}".toString()) 

     abiFilters.addAll(['armeabi'])//, 'armeabi-v7a', 'x86']) 
    } 

и я смущен от того, что должно быть сделано. Пожалуйста, предложите мне способы решения этой проблемы. Спасибо :))

ответ

3

Похоже, что ваши библиотеки boost были созданы против gnustl (или, может быть, stlport), тогда как вы используете libC++. Вы не можете смешивать и сопоставлять STL, поскольку они не совместимы с ABI.

Если заменить stl = "c++_shared" с stl = "gnustl_shared" (или, может быть stlport_shared, то он должен установить связь. В качестве альтернативы построить подталкивание против c++_shared.

+0

Yups, что была проблема. Решить ее :)) Но с gnustl_shared я получаю неопределенная ссылка "to_chars". Наконец, я должен был прокомментировать все сообщения о трассировке, и это сработало. – cRAN

+0

Привет @cRAN Я столкнулся с аналогичной проблемой с неопределенными ссылками на 'to_chars'; не могли бы вы рассказать о том, что вы подразумеваете под «комментированием всех сообщений трассировки»? Благодаря! –

+0

'' 'TRACE (« Ожидание игрока в (<< << endpoint.address(). To_string() << "," << std :: to_string (endpoint.port()) << ")"); '' ' что-то вроде этого – cRAN