当我编译自己的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)
编译设置
答案 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