缺少sync_val_compare_and_swap_1

时间:2017-06-01 11:23:11

标签: android c++ android-ndk linker llvm

我有一个独立的工具链NDK13b,api19,llvm 3.8编译器,arm 32位,带libcpp(llvm C ++库)

我想避免依赖libgcc,所以我构建了compiler-rt。我能找到的最好的版本(给我留下最少的未定义符号)来自https://android.googlesource.com/platform/external/compiler-rt/

在我的链接中,我有:

-nodefaultlibs

避免链接到libgcc,并且:

-lc++_static -lc++abi -lunwind -latomic -ldl -lm -lc -landroid -landroid_support -lclang_rt.builtins-arm -latomic

链接到所有标准库。

当我尝试链接我的程序时,我得到以下未定义的引用:

  

/usr/local/google/buildbot/src/android/ndk-r13-release/external/libcxx/src/algorithm.cpp:83:   错误:未定义引用' __ sync_val_compare_and_swap_1'   /usr/local/google/buildbot/src/android/ndk-r13-release/external/libcxx/src/ios.cpp:74:   错误:未定义引用' __ sync_val_compare_and_swap_1'   /usr/local/google/buildbot/src/android/ndk-r13-release/external/libcxx/src/locale.cpp:53:   错误:未定义引用' __ sync_val_compare_and_swap_1'   /usr/local/google/buildbot/src/android/ndk-r13-release/external/libcxx/src/locale.cpp:464:   错误:未定义参考' __ sync_val_compare_and_swap_1'

有没有办法绕过这个,例如通过定义自己的功能,或者链接一个额外的库?

当我尝试使用here中的代码时(实际上是sync_val_compare_and_swap没有_1),我得到了:

  

../ LIB /建宏/ sync_val_compare_and_swap_1.c   ../lib/builtins/sync_val_compare_and_swap_1.c:6:16:错误:冲突   ' __ sync_val_compare_and_swap_1'的类型内联int32_t   __sync_val_compare_and_swap_1(volatile int32_t * ptr,int32_t oldval,int32_t newval)

          ^
     

../ lib / builtins / sync_val_compare_and_swap_1.c:6:16:注意:' __ sync_val_compare_and_swap_1'是一个内置类型' char(volatile char *,char,char,...)'

1 个答案:

答案 0 :(得分:1)

问题是我在

中链接库
link_directories("${COMPILER_PATH}/../arm-linux-androideabi/lib")

有效地存在varius libatomic.a,libstdc ++。a等。但正确的版本显然在子文件夹armv7-a中,所以应该是:

link_directories("${COMPILER_PATH}/../arm-linux-androideabi/lib/armv7-a")