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 静态链接的主要内容,如果未能解决你的问题,请参考以下文章