2

我正在尝试在 Ubuntu 12.04 64 位上构建一个特定的程序。程序需要编译成 32 位。

我安装了ia32-libsgcc-multilib包。

我设法在 3 台不同的计算机上编译它,但在这台计算机上,它因一个奇怪的错误而失败。出于某种原因,libm.so 没有被正确拾取,或者库有问题。

这是实际失败的编译行,因为它是从 Makefile 中提取的。

gcc -o x86_32_obj/foo x86_32_obj/foomain.o -m32 -fPIC -fno-stack-protector -lc -lgcc -lm -lpthread -lrt -lstdc++ ../libfoo/lib/./libfii.x86_32.a

这是输出

/usr/bin/ld: ../libfoo/lib/./libfoo.x86_32.a(NK_Meas.o): undefined reference to symbol 'expf@@GLIBC_2.0'
/usr/bin/ld: note: 'expf@@GLIBC_2.0' is defined in DSO /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib32/libm.so so try adding it to the linker command line
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib32/libm.so: could not read symbols: Invalid operation
collect2: ld returned 1 exit status
make[1]: *** [foo] Error 2
make: *** [foo] Error 2
4

2 回答 2

2

我已经看到与链接顺序有关的错误。可以通过将 libm 链接指令放在链接配置的最后来解决该错误。

这些相互依赖关系非常依赖于系统,这可能就是相同命令在其他系统上工作的原因。

于 2013-10-05T15:58:59.883 回答
0

发现了问题。显然,我链接的库文件是使用不同版本的 GCC 编译的。我不知道它到底是如何相关的,但是一旦我将 gcc 编译器替换为与库一起使用的编译器,它就可以工作了。

于 2013-10-09T01:17:31.697 回答