我完全没有使用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时,它不适用于较旧版本的OS并引发错误
/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和更新的版本上运行?我应该添加/删除哪些构建选项?

最佳答案

/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

09-10 12:25