2016-07-29 44 views
1

我在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++,而不是靜態鏈接的路徑。 –

回答

3

-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」選項編譯對象。 –