在ndk项目中链接ippcore时对“ __udivdi3”的多个定义

时间:2018-08-30 03:10:36

标签: android-ndk

当我编译自己的ndk项目并与ipp静态库 libippcore_l.a 链接时,链接器抱怨此符号 __ udivdi3 遇到多个定义错误。看来这是在gcc库和ippcore库中定义的除法函数。

如何摆脱此链接错误?删除ippcore不太可能。

..../Android/Sdk/ndk-bundle_r15c/build//../toolchains/x86-4.9/prebuilt/windows-x86_64/lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/bin\ld: error: 
 ..../_lib/Android/x86/libippcore_l.a(divdi3.o): multiple definition of '__udivdi3'

..../Android/Sdk/ndk-bundle_r15c/build//../toolchains/x86-4.9/prebuilt/windows-x86_64/lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/bin\ld:
..../Android/Sdk/ndk-bundle_r15c/build//../toolchains/x86-4.9/prebuilt/windows-x86_64/lib/gcc/i686-linux-android/4.9.x/libgcc.a(_udivdi3.o): previous definition here

clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)

编译设置

  • NDK:r15c
  • 工具链:叮当声
  • APP_ABI:x86
  • APP_STL:c ++ _ static
  • 标志:-frtti -fexceptions -O2 -finline-functions -Wno-narrowing --std = c ++ 11

1 个答案:

答案 0 :(得分:0)

我发现,如果我与另一个使用<iostream>的cpp文件一起编译,则 __ udivdi3 多定义问题就消失了。

最小的cpp文件如下所示

#include <iostream> void f(){ std::cout << ""; }

我猜想iostream的使用会导致libgcc.a未链接,因此没有定义冲突。这可能是暂时的解决方法,但我仍在寻找解决方案。

转储

的结果
  • i686-linux-android-readelf --symbols libgcc.a
  • i686-linux-android-readelf --symbols libippcore_l.a

文件:。\ libgcc.a(_udivdi3.o)

Symbol table '.symtab' contains 16 entries:
   Num:    Value  Size Type    Bind   Vis     Ndx Name
    ...    
    ...
    12: 00000000        0 SECTION LOCAL  DEFAULT   15 
    13: 00000000        0 SECTION LOCAL  DEFAULT   16 
    14: 00000000        0 SECTION LOCAL  DEFAULT   14 
    15: 00000000   257 FUNC        GLOBAL DEFAULT        1 __udivdi3

文件:。\ libippcore_l.a(divdi3.o)

Symbol table '.symtab' contains 45 entries:
   Num:    Value  Size Type    Bind   Vis     Ndx Name
    ...
    ...
    39: 000002a6        0 NOTYPE  LOCAL  DEFAULT        1 Lneed_decgas_3
    40: 00000273        0 NOTYPE  LOCAL  DEFAULT        1 Lafter_decgas_3
    41: 00000297        0 NOTYPE  LOCAL  DEFAULT        1 Lch_signgas_3
    42: 00000000   224 FUNC        GLOBAL DEFAULT        1 __divdi3
    43: 000000e0   162 FUNC        GLOBAL DEFAULT        1 __udivdi3
    44: 00000182   297 FUNC        GLOBAL DEFAULT        1 __moddi3