为什么我的C输出可执行文件这么大?

前端之家收集整理的这篇文章主要介绍了为什么我的C输出可执行文件这么大?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个相当简单的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)

这是什么大小说:

$size a.out
__TEXT  __DATA  __OBJC  others  dec hex
1556480 69632   0   4296504912  4298131024  100304650

我试了条:

$ls -al
...  3946688 May 21 13:20 a.out
$strip a.out
$ls -al
...  3847248 May 21 13:20 a.out

PS.这是我的代码如何组织(也许这是问题的主要原因):

// 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();
}

你怎么看?

解决方法

您是否启用了调试符号进行编译?这可能占大部分的大小.还有你如何确定二进制的大小?假设您处于类UNIX平台,则使用直线“ ls -l”或“ size”命令.如果二进制包含调试符号,则两者可能会产生非常不同的结果.例如,以下是构建 Boost.Regexcredit_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

编辑:添加一些静态链接结果…

这是静态链接时的二进制大小.它越接近你所得到的:

$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共享库的依赖关系如下:

$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库本身由大型对象文件组成:

$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.

猜你在找的C&C++相关文章