Estoy intentando compilar de forma cruzada nuestra base de código C++ (usando CMake) para la plataforma Android usando r5b NDK en Ubuntu 10.10. La fase de compilación tiene éxito, sin embargo, durante la fase de enlace final para .so hay muchas referencias no resueltas a los símbolos que están en el archivo libsupC++. A (que especifico para vincular). También probé -lsupC++ sin diferencia.Android NDK r5b construcción externa y problema de enlace supC++
Intenté seguir la línea de comandos lo más fielmente posible generada por el sistema oficial ndk-build al crear la aplicación de prueba test-gnustl-1 NDK.
Ejecutando la herramienta arm-linux-androideabi-nm en el brazo-linux-androideabi/lib/libsupC++. Un archivo muestra los símbolos definidos (T) a los que se hace referencia en la salida de error.
Un ejemplo de un símbolo definido en libsupC++ no puede encontrar es: __gxx_personality_v0
Aquí es mi muestra de línea de enlace y una muestra resultante de errores.
/home/user/android-ndk-r5b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-g++ -fPIC -Wall -Wextra -Wno-unused -Wno-multichar -fno-rtti -MMD -MP -MF -ffunction-sections -fexceptions -funwind-tables -Wno-psabi -march=armv5te -mtune=xscale -msoft-float -mthumb -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -Wa,--noexecstack -DANDROID -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -O0 -DDEBUG -D_DEBUG -g --sysroot=/home/user/android-ndk-r5b/platforms/android-9/arch-arm -Wl,--gc-sections -Wl,-z,nocopyreloc -Wl,--no-undefined,-z,noexecstack -L/home/user/android-ndk-r5b/platforms/android-9/arch-arm/usr/lib -L/home/user/android-ndk-r5b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/arm-linux-androideabi/lib -Wl,-rpath-link=/home/user/android-ndk-r5b/platforms/android-9/arch-arm/usr/lib /home/user/android-ndk-r5b/sources/cxx-stl/gnu-libstdc++/libs/armeabi/libstdc++.a -lc -lsupc++ -shared -o ../../lib/Debug/libFoo.so CMakeFiles/Foo.dir/Foo.c.o CMakeFiles/Foo.dir/Bar.cpp.o CMakeFiles/Foo.dir/Baz.cpp.o
`CMakeFiles/Foo.dir/Foo.cpp.o: In function 'myFunc':
/home/user/myroj/src/native/modules/libFoo/Foo.cpp:292: undefined reference to '__cxa_end_cleanup'
CMakeFiles/Foo.dir/Foo.cpp.o:(.ARM.extab.text.myFunc+0x0): undefined reference to '__gxx_personality_v0'
...
/home/user/android-ndk-r5b/toolchains/android/sources/cxx-stl/gnu-libstdc++/include/bits/vector.tcc:350: undefined reference to '__cxa_begin_catch'
/home/user/android-ndk-r5b/toolchains/android/sources/cxx-stl/gnu-libstdc++/include/bits/vector.tcc:357: undefined reference to '__cxa_rethrow'
/home/user/android-ndk-r5b/toolchains/android/sources/cxx-stl/gnu-libstdc++/include/bits/stl_vector.h:1153: undefined reference to 'std::__throw_length_error(char const*)'
/home/user/android-ndk-r5b/toolchains/android/sources/cxx-stl/gnu-libstdc++/include/bits/stl_tree.h:199: undefined reference to 'std::_Rb_tree_decrement(std::_Rb_tree_node_base*)'
...
Me trataron de crear una aplicación simple hola-mundo que hace uso de las excepciones y enlaces en un archivo .a sencilla. Obtuve los mismos errores hasta que vinculé directamente en la librería libsupC++. A en lugar de usar '-lsupC++'. Sin embargo, esta misma técnica no funcionó en el paso de enlace de proyecto más grande. Los documentos NDK también sugieren que '-supC++' se debe usar cuando se usan herramientas de compilación externas.
No tengo ideas sobre cómo resolver este problema de vinculación. He intentado reordenar la línea de enlace de tantas maneras como pude pensar. Sé que vincular en general puede ser un proceso voluble. Cualquier ayuda es muy apreciada.
Una solución decepcionante, pero ... está bien. : / – paniq