Optimization 如何减少g+的文件大小+;编译共享对象?

Optimization 如何减少g+的文件大小+;编译共享对象?,optimization,g++,shared-objects,Optimization,G++,Shared Objects,我有一个用g++编译的共享对象(.so)文件,在Windows中,它的大小约为2MB(.DLL,用Visual Studio 2008编译,/O2),但在Linux中,如果用g++-O2标志编译,它的大小为10MB 即使我使用-Os标志编译它,最终的.so文件大小仍然有5MB 我知道可以通过strip命令减少可执行文件,但它似乎无法使用.so文件(可以剥离,但无法加载) 如何减小此共享对象的文件大小?是否有用于共享对象的strip命令 Edit1: 我的g++版本是4.1.2。我在代码中使用Bo

我有一个用g++编译的共享对象(.so)文件,在Windows中,它的大小约为2MB(.DLL,用Visual Studio 2008编译,/O2),但在Linux中,如果用g++-O2标志编译,它的大小为10MB

即使我使用-Os标志编译它,最终的.so文件大小仍然有5MB

我知道可以通过strip命令减少可执行文件,但它似乎无法使用.so文件(可以剥离,但无法加载)

如何减小此共享对象的文件大小?是否有用于共享对象的strip命令

Edit1:

我的g++版本是4.1.2。我在代码中使用Boost1.43

my 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"$@" "$<"
以下是我的共享对象的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内联标志,但我想知道这会影响编译代码的性能

我怀疑这是因为我静态链接Python2.6?在我的ldd中应该有libpython2.6.so,但我没有看到它


“我的链接”或“编译”标志中是否有错误?

看起来这些外部库是静态的,它们正在合并到您的库中。我怀疑这是因为ldd没有显示到它们的链接,这是导致大量可执行文件的常见原因


g++中的-static linker选项可能会导致此问题,或者您正在链接的库只能作为静态库使用。

看起来这些外部库是静态的,它们正在合并到您的库中。我怀疑这是因为ldd没有显示到它们的链接,这是导致大量可执行文件的常见原因


g++中的-static链接器选项可能会导致此问题,或者您正在链接的库只能作为静态库使用。

哦,我犯了一个错误,我尝试了-Os,结果是5MB,我的原始帖子说5MB是用-O1编译的,这是错误的。我修复了帖子。那就是我所得到的,抱歉。请发布
ldd$target。因此
并尝试-fno inline等。您是否使用任何特殊模板功能(MSVC++外部模板,例如?)我不使用任何特殊模板功能,我使用的所有语法都遵循标准。如果我使用了一些奇特的功能,可能是Boost库,比如Boost::MPL、Boost::Tuple、Boost::Variant等。哦,我犯了一个错误,我尝试了-Os,结果是5MB,我原来的帖子说5MB是用-O1编译的,这是错误的。我修复了帖子。那就是我所得到的,抱歉。请发布
ldd$target。因此
并尝试-fno inline等。您是否使用任何特殊模板功能(MSVC++外部模板,例如?)我不使用任何特殊模板功能,我使用的所有语法都遵循标准。如果我使用了一些奇特的特性,可能就是Boost库,比如Boost::MPL、Boost::Tuple、Boost::Variant等等。
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)