我试图在Ubuntu 12.04 64位上构build一个特定的程序。 该程序需要编译32位。
我安装了ia32-libs
和gcc-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
我已经看到了与链接顺序有关的错误。 通过将libm链接指令放置在链接配置的最后 ,可以解决错误。
这些相互依赖性非常依赖于系统,这可能是为什么相同的命令在其他系统上工作。
发现问题。 显然,我链接的库文件是使用不同版本的GCC编译的。 我不知道它是如何相关的,但是一旦我将gcc编译器替换为与它工作的库一起使用的编译器。