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 
+0

你有没有想出解决办法?我遇到了同样的问题,即使有正确的选项传递给链接器?它编译,但是在运行时,它仍然在查看路径中的libstdC++,而不是静态链接的路径。 –

-static-libstdc++-static-libgcc是联动的选择,但你 将它们编译(在那里它们被忽略),不进行联动。

C++编译选项进入QMAKE_CXXFLAGS_{RELEASE|DEBUG}。联动 选项进入QMAKE_LFLAGS_{RELEASE|DEBUG}

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

+0

非常感谢,但是它提供了一个错误:/ 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退出状态 –

+0

@adnankamili如诊断所示,您如果你想在共享库中链接它们,需要使用“-fPIC”选项编译对象。 –