/ usr / bin / ld:动态对象`/usr/lib64/libm.so'

时间:2016-10-03 08:53:31

标签: linux gcc build redhat

我根本没有使用gcc构建经验,现在需要一些帮助。 我使用以下选项构建了代码

gcc \
    -g myCode.C \
    -O \
    -o myCode \
    -I. \
    -L. \
    -L/usr/lib64 \
    -lstdc++ \
    -Wreturn-type \
    -Wswitch \
    -Wcomment \
    -Wformat \
    -Wchar-subscripts \
    -Wparentheses \
    -Wpointer-arith \
    -Wcast-qual \
    -Woverloaded-virtual \
    -Wno-write-strings /usr/lib64/libm.so \
    -Wno-deprecated

在redhat 6计算机上编译myCode.C时,它不能用于旧版本的操作系统抛出错误

/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found
/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.11' not found

要解决此问题,我尝试添加-static构建选项以使所有动态链接库都是静态的,但是有一些我不理解的构建错误:(

/usr/bin/ld: attempted static link of dynamic object `/usr/lib64/libm.so'
collect2: ld returned 1 exit status

如何使我的代码能够使用旧版本的redhat,而不仅仅是6及更新?我应该添加/删除哪些构建选项?

1 个答案:

答案 0 :(得分:1)

/usr/lib64/libm.so是一个动态库。由于您明确地与其关联,-static并未强制使用静态版本(libm.a) 您正在尝试编译C ++程序,因此您应该使用g ++。那时不需要传递libstdc++libm库。 /usr/lib64也应该在您的标准链接路径中,因此不需要。

所以你应该使用:

g++ \
    -static \
    -g myCode.C \
    -O \
    -o myCode \
    -I. \
    -L. \
    -Wreturn-type \
    -Wswitch \
    -Wcomment \
    -Wformat \
    -Wchar-subscripts \
    -Wparentheses \
    -Wpointer-arith \
    -Wcast-qual \
    -Woverloaded-virtual \
    -Wno-write-strings \
    -Wno-deprecated
相关问题