libstdC++ - 不使用qmake静态链接
我在Debian 7上编译了我的库的动态和静态版本。我的用户希望在RHEL6上使用该库,因此在阅读了很多帖子之后,似乎静态链接libstdC++应该修复问题。libstdC++ - 不使用qmake静态链接
我使用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
-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 against'_ZTIN10__cxxabiv115__forced_unwindE'can not在制作共享对象时使用;使用-fPIC重新编译 /usr/lib/gcc/x86_64-linux-gnu/4.7/libstdc++.a:无法读取符号:错误值 collect2:错误:ld返回1退出状态 –
@adnankamili如诊断所示,您如果你想在共享库中链接它们,需要使用“-fPIC”选项编译对象。 –
你有没有想出解决办法?我遇到了同样的问题,即使有正确的选项传递给链接器?它编译,但是在运行时,它仍然在查看路径中的libstdC++,而不是静态链接的路径。 –