2011-10-05 85 views
1

我有一個用g ++編譯的共享對象(.so)文件,在Windows中,其大小約爲2MB(.DLL,用Visual Studio 2008編譯,/ O2),但在Linux中,如果使用g ++編譯,其大小爲10MB - O2旗幟。如何減少g ++編譯共享對象的文件大小?

即使我用-Os標誌編譯它,最後的.so文件大小仍然有5MB。

我知道可執行文件可以通過strip命令減少,但它似乎不能與.so文件一起工作(它可以被剝離,但無法加載)。

如何縮小此共享對象的文件大小?是否有共享對象的任何strip命令?

EDIT1:

我的G ++版本是4.1.2。我在代碼中使用了Boost 1.43。

的編譯標誌在我的makefile:

g++ -DNDEBUG -D_PYTHON -DBOOST_PYTHON_STATIC_LIB -I"boost_1_43_0" -I"/usr/local/include/python2.6" -fno-tree-vrp -Os -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o"[email protected]" "$<" 

的鏈接標誌:

LIBS := -lm -lz -ltidy -lpng14 -lxml2 -liconv -lboost_regex-gcc41-mt-s -lboost_serialization-gcc41-mt-s -lboost_python-gcc41-mt-s -lpython2.6 

這裏是我的共享對象LDD:

linux-gate.so.1 => (0x00327000) 
libz.so.1 => /lib/libz.so.1 (0x004f4000) 
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00110000) 
libm.so.6 => /lib/libm.so.6 (0x00f31000) 
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x0053b000) 
libc.so.6 => /lib/libc.so.6 (0x00328000) 
/lib/ld-linux.so.2 (0x0077d000) 

我將與-fno嘗試內聯標誌,但我想知道這會影響編譯代碼的性能。

我懷疑這是因爲我靜態鏈接到Python 2.6?在我的ldd中應該有libpython2.6.so,但我沒有看到它。

我的鏈接或編譯標誌有問題嗎?

+0

嘗試'-Os'而不是'-O2'。 – Blindy

+0

哦,我犯了一個錯誤,我嘗試了-Os,這個結果是5MB,我原來的帖子說5MB是用-O1編譯的,那是錯誤的。我修復了這個帖子。 – Bear

+0

就是這樣,我很抱歉。 – Blindy

回答

1

它看起來像那些外部庫是靜態的,它們正在被合併到你的庫中。我懷疑這是因爲ldd沒有顯示鏈接,這是一個巨大的可執行文件的常見原因。

g ++中的靜態鏈接器選項可能會導致此問題,或者您正在鏈接的庫僅可用作靜態庫。