代码之家  ›  专栏  ›  技术社区  ›  zach

为什么我的visual studio.obj文件比output.exe文件大?

  •  4
  • zach  · 技术社区  · 17 年前

    作为背景,我是一个开源项目的开发人员,一个名为 openframeworks 这是一个不同的库的包装,如OpenGL、QuiTimeTimes、FielVIZO等。在下一个版本中,我们添加了一个叫做POCO的C++库,它类似于Boost在某些方面,它是java基础库类型功能的替代。

    我刚刚注意到,在我将POCO库添加为静态链接库的最新版本中,编译过程中生成的.obj文件非常庞大—例如,对于非常小的.cpp文件,几个.obj文件的大小都是2 MB。总体编译的.obj文件大约为12mb左右。另一方面,生产的exe是小的-300k到1mb。

    相比之下,在code::blocks中编译的同一个库生成的.obj文件在exe中的大小大致相同—它们都相当小。

    链接和visual studio中的.obj进程是否有我不理解的地方?例如,它是在进行某种智能预墨,还是在增加.obj大小?我尝试了一些设置,如增量链接等,但没有看到任何更改。

    提前感谢您的任何尝试或见解!

    -扎克


    注:非常感谢!我刚试过,dumpbin,上面写着“匿名对象”,但没有返回关于这个对象的信息。 this 可能是。。。。


    注意2,在签出上面的链接后,删除LTCG(link time code generation-/GL),则.obj文件要小得多,dumpbin可以理解它们。再次感谢!!

    4 回复  |  直到 17 年前
        1
  •  1
  •   coppro    17 年前

    我并不是Visual Studio的专家,因为我几乎没有使用它,但是我相信visualstudio采用了链接时间优化,这可以使生成的代码运行得更快,但是在库中会花费很多空间。另外,可能(我不知道内部结构)调试信息直到实际的链接阶段才被剥离。

        2
  •  1
  •   Die in Sente    17 年前

    可能区别在于调试信息。

    编译器将调试信息输出到.obj中,但链接器不会将该数据放入.exe或.dll中。它要么被丢弃,要么被放入.pdb中。

    在任何情况下,使用.obj文件上的Visual Studio DUMPBIN实用程序查看其中的内容。

        3
  •  1
  •   MSalters    17 年前

    对象文件需要包含足够的链接信息。在C++中,这是基于名称的。如果两个对象文件使用相同的名称,则它们引用相同的对象(数据/函数/类)。这意味着所有对象文件必须包含可能被其他对象文件引用的所有对象的名称。但是,可执行文件需要库外部可见的名称。对于DLL,这意味着只导出名称。保存是双重的:名称较少,并且这些名称在DLL中只出现一次。

    现代C++库将使用命名空间。这些名称空间意味着对象名称变长,因为它们也包含封装名称空间的名称。

        4
  •  0
  •   James Eichele Bernard Igiri    17 年前

    编译后的库obj文件将非常庞大,因为它们必须包含最终用户可能最终使用的所有函数、类和模板。

    链接到库的可执行文件将更小,因为它们只包含运行所需的编译代码。这通常是库的一小部分。