我正在尝试使用Ubuntu 10.10上的r5b NDK为Android平台交叉编译我们的C ++代码库(使用CMake)。编译阶段成功,但是在.so的最后一个链接阶段,有许多未解析的对libsupc ++中的符号的引用。一个文件(我指定链接)。我也试过-lsupc ++而没有区别。
在构建test-gnustl-1 NDK测试应用程序时,我尝试尽可能地遵循官方ndk-build系统生成的命令行。
在arm-linux-androideabi / lib / libsupc ++上运行arm-linux-androideabi-nm工具。文件显示错误输出中引用的定义符号(T)。
它无法找到的libsupc ++中定义的符号示例是:__gxx_personality_v0
这是我的示例链接行和错误的结果示例。
/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*)'
...
我尝试创建一个简单的hello-world应用程序,它在简单的.a文件中使用异常和链接。我得到了相同的错误,直到我在libsupc ++中直接链接了一个库而不是使用'-lsupc ++'。但是,这种相同的技术不适用于较大的项目链接步骤。 NDK文档还建议在使用外部构建工具时应使用“-lsupc ++”。
我对如何解决此链接问题缺乏想法。我尝试过多次重新排序链接线。我知道链接一般来说可能是一个变化无常的过程。 非常感谢任何帮助。
答案 0 :(得分:6)
事实证明我需要在路径中添加-L/home/user/android-ndk-r5b/sources/cxx-stl/gnu-libstdc++/libs/armeabi"
并明确链接" / home/user/android-ndk-r5b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/arm-linux-androideabi/lib/thumb/libsupc++.a
"包含在" --start-group --end-group
"中的所有包含库子句。
希望这也有助于其他人。