2013-08-07 81 views
0

我目前正在移植一個庫(不是我自己寫的,我只是「移植它)使用MinGW編譯器。該庫是一個真正的重量級,具有各種C++「黑魔法」(多重繼承,模板模板模板,非常宏重等)。MinGW二進制3x大小與MSVC二進制

現在,過了幾個星期,我得到的一切都很好地編譯,它也似乎很好地工作(單元測試工作,以及演示)。

但是,我發現的錯誤是MinGW二進制文件的大小與MSVC二進制文件相反。我知道MinGW二進制文件通常要稍微大一點,因爲它們必須包含自己的非MS系統庫,但我們談論的是MinGW爲33 MB,MSVC爲13 MB。 這就是「釋放」(-O3和-s標誌)版本!

這些都是我的MinGW進行編譯標誌:

-c -O3 -s -MMD -march=native -frtti 

和鏈接器是這樣的:

-shared -s -static-libgcc -static-libstdc++ 

我知道,RTTI增加了一些大小,但它也必須是在MSVC二進制文件中。而靜態libgcc和libstdC++庫不能那麼大......或者他們可以嗎?

我在這裏錯過了什麼?通常情況下,MinGW和MSVC之間的尺寸差異不是大。

回答

1

首先,誰在乎?你看過這個更大的尺寸來影響性能嗎?

第二:你確定你是靜態鏈接到MSVC嗎?請確保與Dependency Walker確認。

第三:是MinGW GCC編譯的二進制文件通常較大。這是因爲MinGW提供了C庫的一部分來彌補msvcr *是多麼可笑地遵從合規性。儘管如此,這從來沒有表現出很大的差異。

第四:兩個編譯器之間的模板和內聯處理可能不同。

第五:你有沒有試過用-fno-keep-inline-dllexport和/或-Os編譯GCC版本?

+0

首先,我們的存儲庫關心。 ;)特別是當我不得不重新上傳這個庫多次時,我是否應該改變庫中的某些東西(我無法上傳源代碼,只是將二進制文件上傳到我們自己的回購庫中)。我會嘗試你建議的標誌。看看是否有區別。 – TheSHEEEP

+0

靜態鏈接到MSVC是什麼意思?靜態鏈接什麼?我正在創建一個動態庫和兩個。或者你的意思是運行時?如果是這樣,我認爲MSVC的C++運行時不是〜20MB大,是嗎? – TheSHEEEP

+0

在GCC的情況下,您正在靜態鏈接libgcc和libstdC++,這是一大堆代碼。如果你在MSVC的情況下沒有這樣做(我甚至不確定你是否可以),比較文件大小是沒有意義的。如果不靜態鏈接GCC運行時庫,會發生什麼情況? – rubenvb

0

我曾經遇到過這個問題,對我來說結果只是rubenvb的建議 - C/C++ std庫在MinGW中靜態鏈接,但在MSVC中動態鏈接。我在每個已編譯的可執行文件/ dll上使用「dumpbin/imports」來確定這一點。如果您沒有看到MSVC * .dll作爲導入,則它是靜態鏈接的。您可以通過更改Visual Studio中的「運行時庫」設置來靜態鏈接MSVC中的std庫,這是cl.exe的標誌,即/ MT(用於靜態)或/ MD(用於動態)。我認爲它默認是動態的。