2017-07-29 59 views
0

我正在使用mingw 64位與cygwin。MinGW,如何避免鏈接靜態完整libstdC++

我知道,如果我編譯使用

x86_64-w64-mingw32-g++.exe -std=c++11 hello.cpp 

輸出.exe文件不運行,除非庫路徑與libstdC++和其他圖書館是PATH環境變量中指定。

另一種選擇是因爲我想單個.exe,我可以很容易地在不同的機器複製,第二個解決方案是爲我好鏈接靜態

x86_64-w64-mingw32-g++.exe -std=c++11 hello.cpp -static-libgcc -Wl,-Bstatic -lstdc++ -lpthread 

。我唯一的問題是,因爲我靜態鏈接,即使是一個簡單的helloworld程序,可執行文件的大小也會增加到10 Mb以上。所以我的問題是:是否可以靜態鏈接程序實際使用的庫部件?

回答

0

Windows上的binutils鏈接程序ld不支持正確的--gc-sections參數,它與編譯器標記-ffunction-sections和-fdata-sections一起使用,允許鏈接程序丟棄未使用的代碼塊。

你是直截了當的運氣。你可以做的唯一事情就是平常:去除可執行文件(通過在鏈接後運行strip命令)並編譯代碼,優化大小使用-Os。


牢記這些選項都無法在Windows(這對於這個答案的目的,包括在Cygwin平臺)工作,這通常是你如何能做到這一點:

g++ -c -Os -ffunction-sections -fdata-sections some_file.cpp -o some_file.o 
g++ -c -Os -ffunction-sections -fdata-sections main.cpp -o main.o 
g++ -Wl,--gc-sections main.o some_file.p -o my_executable 
+0

我從來沒有執行過這些操作之前。您介意提供更多細節還是示例? - – Hybridslinky