8

我正在尝试使用 Ubuntu 10.10 上的 r5b NDK 为 Android 平台交叉编译我们的 C++ 代码库(使用 CMake)。编译阶段成功,但是在 .so 的最终链接阶段,有许多未解析的对 libsupc++.a 文件(我指定链接)中的符号的引用。我也试过 -lsupc++ 没有区别。

在构建 test-gnustl-1 NDK 测试应用程序时,我尝试尽可能地遵循官方 ndk-build 系统生成的命令行。

在 arm-linux-androideabi/lib/libsupc++.a 文件上运行 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++.a 库而不是使用“-lsupc++”之前,我遇到了同样的错误。但是,这种相同的技术不适用于较大的项目链接步骤。NDK 文档还建议在使用外部构建工具时应使用“-lsupc++”。

我对如何解决这个链接问题一无所知。我已经尝试过尽可能多地重新排序链接线。我知道链接通常是一个变化无常的过程。任何帮助是极大的赞赏。

4

1 回答 1

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”子句中的所有包含库。

希望这对其他人也有帮助。

于 2011-06-06T18:22:39.593 回答