Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 升级Linux发行版后对libm符号的未定义引用_C_Gcc_Linker_Linker Errors - Fatal编程技术网

C 升级Linux发行版后对libm符号的未定义引用

C 升级Linux发行版后对libm符号的未定义引用,c,gcc,linker,linker-errors,C,Gcc,Linker,Linker Errors,我将我的Linux发行版从Pop OS 19.10升级到20.04,其中自然包括对glibc&co.的升级。从那时起,我开始发现libm符号的链接器错误,如\uuuuPow\uFinite 不幸的是,引用这些符号的代码是带有第三方专有代码的静态库(下面编辑的代码段中的libWithPowFiniteRef.a)。我无法访问源代码 我使用nm检查了/lib/x86\u 64-linux-gnu/libm.so.6。符号在那里: nm -gD /lib/x86_64-linux-gnu/libm.s

我将我的Linux发行版从Pop OS 19.10升级到20.04,其中自然包括对glibc&co.的升级。从那时起,我开始发现libm符号的链接器错误,如
\uuuuPow\uFinite

不幸的是,引用这些符号的代码是带有第三方专有代码的静态库(下面编辑的代码段中的libWithPowFiniteRef.a)。我无法访问源代码

我使用
nm
检查了
/lib/x86\u 64-linux-gnu/libm.so.6
。符号在那里:

nm -gD /lib/x86_64-linux-gnu/libm.so.6
...
0000000000010e00 W powf64x
00000000000471f0 i __powf_finite
000000000002ed90 i __pow_finite
0000000000010e00 W powl
0000000000019860 T __powl_finite
...
所以我无法解释这些错误:

g++  -o ./media_tests -Wl,--verbose -Wl,--start-group @"./media_tests.rsp"  -ldl -lpthread -lrt ../../third_party/other.so  ../../third_party/redacted/lib/Linux/x64/libWithPowFiniteRef.a -Wl,--end-group
...
attempt to open /usr/lib/gcc/x86_64-linux-gnu/9/libm.so failed
attempt to open /usr/lib/gcc/x86_64-linux-gnu/9/libm.a failed
attempt to open /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/libm.so succeeded
...
attempt to open /usr/lib/gcc/x86_64-linux-gnu/9/libm.so failed
attempt to open /usr/lib/gcc/x86_64-linux-gnu/9/libm.a failed
attempt to open /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/libm.so succeeded
opened script file /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/libm.so
/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/libm.so
opened script file /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/libm.so
attempt to open /lib/x86_64-linux-gnu/libm.so.6 succeeded
/lib/x86_64-linux-gnu/libm.so.6
...
/usr/bin/ld:../../third_party/redacted/lib/Linux/x64/redacted.a(redacted.o): in function `RedactedX':
redacted1.c:(.text+0xbb0): undefined reference to `__pow_finite'
/usr/bin/ld: ../../third_party/redacted/lib/Linux/x64/redacted.a(redacted.o): in function `RedactedY':
redacted2.c:(.text+0x7ad9): undefined reference to `__pow_finite'
/usr/bin/ld: redacted.c:(.text+0x8c74): undefined reference to `__pow_finite'
/usr/bin/ld: link errors found, deleting executable `./media_tests'

也许我们的解决方案是向供应商请求一个新的静态库,但我想了解原因。

-lm
添加到命令行帮助中吗?另请参阅。听起来您要么需要重新编译(或者请求一个新的供应商库),要么,如果这不是一个选项,就链接到旧库。或者,您可以获取这些函数的源代码并构建自己的兼容性库。如果在gcc命令行中的静态库之后添加
-lm
,会发生什么情况?@TomKarzes:您击中了它的头部。实际上,我可以通过构建一个简单的静态库,在旧发行版(使用Docker)中使用
pow
-ffast math
,并尝试在新发行版中链接到它来重新解决这个问题。我还检查了新发行版中构建的相同库,使用了相同的标志:
\uuuupow\ufinite
不再被引用,只是普通的
pow
。通过使用旧发行版将静态库转换为共享库,我能够解决这个问题。我能够在新发行版中使用生成的
.so
。你应该提交一个答案,这样我才能给你适当的信用。