我完全没有使用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