libstdc++ - 不使用 qmake 静态链接

Posted

技术标签:

【中文标题】libstdc++ - 不使用 qmake 静态链接【英文标题】:libstdc++ - not linking statically using qmake 【发布时间】:2016-07-29 18:30:03 【问题描述】:

我在 Debian 7 上编译了我的库的动态和静态版本。我的用户想在 RHEL6 上使用该库,因此在阅读了许多帖子后,似乎静态链接 libstdc++ 应该可以解决问题。

我使用的是qmake,所以在我添加的.pro文件中

unix: QMAKE_CXXFLAGS_RELEASE += -static-libstdc++ -static-libgcc -fvisibility=hidden -w

然后我执行以下命令:

qmake MyLibrary.pro -spec linux-g++-64 "CONFIG += release"

输出是

g++ -c -m64 -pipe -O2 -static-libstdc++ -static-libgcc -fvisibility=hidden -w -Wall -W -D_REENTRANT -fPIC -DMYLIBRARY_LIBRARY -DQT_NO_DEBUG -DQT_PLUGIN -I/usr/share/qt4/mkspecs/linux-g++-64 -I. -I/usr/include/qt4 -IMyLibrary/Curl/include -I. -o LexAbstraction.o MyLibrary/LexAbstraction.cpp
g++ -c -m64 -pipe -O2 -static-libstdc++ -static-libgcc -fvisibility=hidden -w -Wall -W -D_REENTRANT -fPIC -DMYLIBRARY_LIBRARY -DQT_NO_DEBUG -DQT_PLUGIN -I/usr/share/qt4/mkspecs/linux-g++-64 -I. -I/usr/include/qt4 -IMyLibrary/Curl/include -I. -o MyLibrary.o MyLibrary/MyLibrary.cpp
g++ -c -m64 -pipe -O2 -static-libstdc++ -static-libgcc -fvisibility=hidden -w -Wall -W -D_REENTRANT -fPIC -DMYLIBRARY_LIBRARY -DQT_NO_DEBUG -DQT_PLUGIN -I/usr/share/qt4/mkspecs/linux-g++-64 -I. -I/usr/include/qt4 -IMyLibrary/Curl/include -I. -o LexBotan.o MyLibrary/LexBotan.cpp
g++ -c -m64 -pipe -O2 -static-libstdc++ -static-libgcc -fvisibility=hidden -w -Wall -W -D_REENTRANT -fPIC -DMYLIBRARY_LIBRARY -DQT_NO_DEBUG -DQT_PLUGIN -I/usr/share/qt4/mkspecs/linux-g++-64 -I. -I/usr/include/qt4 -IMyLibrary/Curl/include -I. -o LexCrypter.o MyLibrary/LexCrypter.cpp
g++ -c -m64 -pipe -O2 -static-libstdc++ -static-libgcc -fvisibility=hidden -w -Wall -W -D_REENTRANT -fPIC -DMYLIBRARY_LIBRARY -DQT_NO_DEBUG -DQT_PLUGIN -I/usr/share/qt4/mkspecs/linux-g++-64 -I. -I/usr/include/qt4 -IMyLibrary/Curl/include -I. -o LexHelper.o MyLibrary/LexHelper.cpp
rm -f libMyLibrary.so
g++ -m64 -Wl,-O1 -shared -o libMyLibrary.so LexAbstraction.o MyLibrary.o LexBotan.o LexCrypter.o LexHelper.o   -L/usr/lib/x86_64-linux-gnu -lpthread

但是当我执行时

ldd -v libMyLibrary.so | grep GLIBCXX

它给出以下输出:

libstdc++.so.6 (GLIBCXX_3.4.15) => /usr/lib/x86_64-linux-gnu/libstdc++.so.6
libstdc++.so.6 (GLIBCXX_3.4.9) => /usr/lib/x86_64-linux-gnu/libstdc++.so.6
libstdc++.so.6 (GLIBCXX_3.4) => /usr/lib/x86_64-linux-gnu/libstdc++.so.6

【问题讨论】:

你有想过这个吗?即使将正确的选项传递给链接器,我也遇到了同样的问题?它可以编译,但是在运行时它仍然在查看路径中的 libstdc++,而不是静态链接的。 【参考方案1】:

-static-libstdc++-static-libgcc 是链接选项,但您是 将它们传递给编译(它们被忽略)而不是链接。

C++ 编译选项进入QMAKE_CXXFLAGS_RELEASE|DEBUG。连锁 选项进入QMAKE_LFLAGS_RELEASE|DEBUG

-fvisibility是一个编译选项,所以它应该保留在QMAKE_CXXFLAGS_RELEASE

【讨论】:

非常感谢,但它给出了一个错误:/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/4.7/libstdc++.a(compatibility.o): relocation R_X86_64_32 针对 `_ZTIN10__cxxabiv115__forced_unwindE' 制作共享对象时不能使用;使用 -fPIC /usr/lib/gcc/x86_64-linux-gnu/4.7/libstdc++.a 重新编译:无法读取符号:错误值 collect2:错误:ld 返回 1 退出状态 @adnankamili 正如诊断所暗示的,如果您打算将对象链接到共享库中,则需要使用选项 -fPIC 编译对象。

以上是关于libstdc++ - 不使用 qmake 静态链接的主要内容,如果未能解决你的问题,请参考以下文章

libstdc++ 静态链接和 System V ABI

如何静态链接到 libstdc++.喜欢升级的GCC的朋友快来看看

使用静态 qmake 使用 QT Widget 插件

用qmake搭建框架之加载静态共享库

QMAKE:将静态库链接到另一个静态库

centos 源上怎么没有 libstdc++