如何处理多重定义问题以及 symbol type 'W' 在 nm symbol table 中的含义

How to deal with multiple definitions problem and What does symbol type 'W' mean in nm symbol table

我正在尝试为 ARM 交叉编译 C 代码(涉及 TFLite)。我已将以下库与 libtensorflow_c.so 链接在一起(删除其中任何一个都会出现“未定义的引用”错误)

但我收到以下错误

$ make exe 2>&1 | tee log.txt
aarch64-linux-android-clang++ -o NC.exe build/main.o -fPIE -pie -lc -lm -ldl -llog -mfpu=neon-fp-armv8 -march=armv8-a -nodefaultlibs -lc -lm -ldl -llog -mfpu=neon-fp-armv8 -march=armv8-a -lgcc  Tlib/libtensorflowlite_c.so Tlib/ld-linux-aarch64.so.1 Tlib/libc.so.6 Tlib/libc++.so Tlib/libdl.so.2 Tlib/libm.so.6 Tlib/libpthread.so.0 Tlib/librt.so.1 Tlib/libstdc++.so.6 Tlib/libgcc_s.so.1
Tlib/libpthread.so.0:(*IND*+0x0): multiple definition of `system'
Tlib/libpthread.so.0:(*IND*+0x0): multiple definition of `siglongjmp'
Tlib/libpthread.so.0:(*IND*+0x0): multiple definition of `fork'
Tlib/libpthread.so.0:(*IND*+0x0): multiple definition of `fcntl'
Tlib/libpthread.so.0:(*IND*+0x0): multiple definition of `longjmp'
clang60++.exe: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [exe] Error 1

我检查了 .so 文件的符号表,'system' 出现在 libc.so.6 和 libpthread.so.0 中,符号类型为 'W' 和 'T'分别

>>nm -D libpthread.so.0 | grep "system"
U __libc_system
000000000001107c T system
>>nm -D libc.so.6 | grep "system"
000000000003bccc T __libc_system
00000000000d7418 T svcerr_systemerr
000000000003bccc W system

其余单词类似。我的问题是“W”作为符号类型意味着什么以及如何摆脱这个多重定义问题

提前致谢

更改链接库的顺序解决了这些错误。 (libpthread应该放在libc之前)

谢谢