g 命令編譯出來的檔案體積過大解決方案

2021-10-10 11:18:40 字數 1967 閱讀 4722

這幾天在使用gcc編譯器的g++編譯cpp檔案時,發現即使是乙個很簡單的**檔案編譯出來的exe體積會達到3m以上。我也通過上網究其原因,來和大家分享一下解決方案。

在使用gcc編譯器時編譯出來的exe是帶有符號資訊的。符號資訊是什麼?簡而言之就是應用程式的除錯資訊,專門用來作除錯之用,其中儲存了程式變數以及其餘很多資訊。但是我們編譯出來exe並僅僅只是去使用它時是不需要這些符號資訊的。下面可以看乙個例項:

我這裡有乙個main.cpp檔案,使用g++命令編譯,生成的exe檔案:

足足有2.98mb。我們使用nm命令來檢視其符號資訊:

nm main.exe
結果:

可見其符號資訊非常多。

那麼我們的思路很清晰了,既然平時使用exe檔案不需要符號資訊,那麼去掉符號資訊就行了。使用strip命令:

strip 檔名
例如我執行:

執行這時會發現編譯出來的exe變小了許多,但是仍然可以正常執行。再使用nm命令檢視它的符號資訊,會提示已經沒有符號資訊了!

備用位址

upx命令使用方法:

upx [-123456789dlthvl] [-qvfk] [-o file] file

引數1:

-1 最快壓縮

-9 最大壓縮

-d 解壓縮

-l 列出壓縮的檔案

-t 測試壓縮的檔案

-v 顯示版本資訊

-h 顯示更多幫助

-l 顯示軟體許可證

引數2:

-q 安靜模式

-v 詳細模式

-o 指定輸出檔案路徑(若帶上此引數,原被壓縮檔案將保留)

-f 強行壓縮

-k 保留備份檔案

下面舉幾個例項:

把main.exe壓縮:

upx main.exe

壓縮main.exe但是保留原來的main.exe檔案,另存壓縮的檔案到e:\mainc.exe(通過-o引數指定新生成檔案,不加-o就是壓縮但不保留原來檔案)

upx -o e:\mainc.exe main.exe

壓縮main.exe,指定壓縮等級為最大(可見下面upx帶上了-9這個引數,這個9就是壓縮等級,壓縮等級從1到9,1是最小壓縮執行效率優先,9是最大壓縮節省空間為主,可以配合上面的-o引數一起使用):

upx -9 main.exe

若c.exe已經被壓縮,還可以通過upx命令解壓縮(-d引數,同樣可以配合-o引數指定輸出目錄):

upx -d c.exe

下面我對上文的main.exe執行命令:

可以發現這個檔案又減少了許多,但是還是可以正常執行。

還需要注意的是,若要同時去除符號資訊和進行upx壓縮,必須先去除符號資訊再使用upx命令壓縮!若先進行了upx壓縮你會發現無法使用strip命令去除符號資訊了!

如何看檔案是否是交叉編譯出來的

h是我用gcc o h hello.c 來編譯的 root boy desktop home boy workplase file h h elf 32 bit lsb executable,intel 80386,version 1 sysv dynamically linked uses sha...

如何從編譯出來的可執行檔案獲取編譯選項

readelf命令 readelf debug dump info path to executable grep dw at producer strings命令 strings path to executable grep march 其實可能還有很多方法.其實,掌握乙個領域的技能的學習方法是...

ES編譯出來為snapshot版本的解決辦法

es 的編譯命令如下 gradlew assemble命令編譯出來的包預設是帶有 snapshot 字尾的,這種快照版本的的es 安裝包,部署起來可能會有問題。比如,當想要獲取es版本號的時候,es會報錯 illegal version format snapshots are only suppo...