我有一个相当简单的C项目,它使用boost ::
regex库.我得到的输出是3.5Mb的大小.据了解,我正在静态链接所有boost .CPP文件,包括所有函数/方法.也许可以以某种方式指示我的链接器仅使用boost而不是全部的必需元素?谢谢.
$c++ —version i686-apple-darwin10-g++-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5659)
这是什么大小说:@H_301_5@
$size a.out __TEXT __DATA __OBJC others dec hex 1556480 69632 0 4296504912 4298131024 100304650
我试了条:@H_301_5@
$ls -al ... 3946688 May 21 13:20 a.out $strip a.out $ls -al ... 3847248 May 21 13:20 a.out
PS.这是我的代码如何组织(也许这是问题的主要原因):@H_301_5@
// file MyClass.h class MyClass { void f(); }; #include "MyClassImpl.h" // file MyClassImpl.h void MyClass::f() { // implementation... } // file main.cpp #include "MyClass.h" int main(int ac,char** av) { MyClass c; c.f(); }
你怎么看?@H_301_5@
解决方法
您是否启用了调试符号进行编译?这可能占大部分的大小.还有你如何确定二进制的大小?假设您处于类UNIX平台,则使用直线“
ls -l
”或“
size
”命令.如果二进制包含调试符号,则两者可能会产生非常不同的结果.例如,以下是构建
Boost.Regex“
credit_card_example.cpp”示例时得到的结果.
$g++ -g -O3 foo.cpp -lboost_regex-mt $ls -l a.out -rwxr-xr-x 1 void void 483801 2010-05-20 10:36 a.out $size a.out text data bss dec hex filename 73330 492 336 74158 121ae a.out
$g++ -c -g -O3 foo.cpp $ls -l foo.o -rw-r--r-- 1 void void 622476 2010-05-20 10:40 foo.o $size foo.o text data bss dec hex filename 49119 4 40 49163 c00b foo.o
这是静态链接时的二进制大小.它越接近你所得到的:@H_301_5@
$g++ -static -g -O3 foo.cpp -lboost_regex-mt -lpthread $ls -l a.out -rwxr-xr-x 1 void void 2019905 2010-05-20 11:16 a.out $size a.out text data bss dec hex filename 1204517 5184 41976 1251677 13195d a.out
还有可能大部分的大小来自Boost.Regex库依赖的其他库.在我的Ubuntu框中,Boost.Regex共享库的依赖关系如下:@H_301_5@
$ldd /usr/lib/libboost_regex-mt.so.1.38.0 linux-gate.so.1 => (0x0053f000) libicudata.so.40 => /usr/lib/libicudata.so.40 (0xb6a38000) libicui18n.so.40 => /usr/lib/libicui18n.so.40 (0x009e0000) libicuuc.so.40 => /usr/lib/libicuuc.so.40 (0x00672000) librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0x001e2000) libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x001eb000) libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x00110000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x009be000) libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0x00153000) libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x002dd000) /lib/ld-linux.so.2 (0x00e56000)
ICU图书馆可以相当大.除了调试符号,也许它们是二进制文件大小的主要贡献者.此外,在静态链接的情况下,它看起来像Boost.Regex库本身由大型对象文件组成:@H_301_5@
$size --totals /usr/lib/libboost_regex-mt.a | sort -n 0 0 0 0 0 regex_debug.o (ex /usr/lib/libboost_regex-mt.a) 0 0 0 0 0 usinstances.o (ex /usr/lib/libboost_regex-mt.a) 0 0 0 0 0 w32_regex_traits.o (ex /usr/lib/libboost_regex-mt.a) text data bss dec hex filename 435 0 0 435 1b3 regex_raw_buffer.o (ex /usr/lib/libboost_regex-mt.a) 480 0 0 480 1e0 static_mutex.o (ex /usr/lib/libboost_regex-mt.a) 1543 0 36 1579 62b cpp_regex_traits.o (ex /usr/lib/libboost_regex-mt.a) 3171 632 0 3803 edb regex_traits_defaults.o (ex /usr/lib/libboost_regex-mt.a) 5339 8 13 5360 14f0 c_regex_traits.o (ex /usr/lib/libboost_regex-mt.a) 5650 8 16 5674 162a wc_regex_traits.o (ex /usr/lib/libboost_regex-mt.a) 9075 4 32 9111 2397 regex.o (ex /usr/lib/libboost_regex-mt.a) 17052 8 4 17064 42a8 fileiter.o (ex /usr/lib/libboost_regex-mt.a) 61265 0 0 61265 ef51 wide_posix_api.o (ex /usr/lib/libboost_regex-mt.a) 61787 0 0 61787 f15b posix_api.o (ex /usr/lib/libboost_regex-mt.a) 80811 8 0 80819 13bb3 icu.o (ex /usr/lib/libboost_regex-mt.a) 116489 8 112 116609 1c781 instances.o (ex /usr/lib/libboost_regex-mt.a) 117874 8 112 117994 1ccea winstances.o (ex /usr/lib/libboost_regex-mt.a) 131104 0 0 131104 20020 cregex.o (ex /usr/lib/libboost_regex-mt.a) 612075 684 325 613084 95adc (TOTALS)
如果某些或所有这些对象文件被链接到您的二进制文件中,您可以单独从Boost.Regex得到〜600K.@H_301_5@