2011-10-05 219 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 ++中的静态链接器选项可能会导致此问题,或者您正在链接的库仅可用作静态库。