2016-03-16 228 views
0

我开始在Rust中编程,我注意到的第一件事情是Rust生成大的二进制文件。例如,Rust的“Hello world!”二进制是〜600K大,而等价的C二进制是〜8K大。C静态链接库吗?

经过一番搜索,我发现this SO帖子里面解释了锈的二进制文件大,因为所有需要的库静态链接。但是C的情况不是这样吗?当我在C中编写#include <stdio.h>时,我不是静态链接相关的I/O库吗?我一直认为答案是'是',但现在我怀疑自己。

+0

不,并不总是如此。通常'-l'用于'.so'文件的动态链接。 –

+1

链接与头文件包含不同。 ('#包括'是不是一个链接命令/声明。) – callyalater

+0

没有,静态还是动态链接是你选择的选项。 –

回答

3

#include复制文件内容源文件,但如果头无非是函数声明的更多,所有会做的是告诉程序,这些功能都可以在你的代码中调用。实际的实现可能会在另一个文件中定义,这些文件需要以静态或动态方式链接到您的可执行文件。如果您查看stdio.h的标题,您会发现它只包含函数原型。

许多编译器提供的选项为标准库做静态或动态链接。

+0

谢谢。最后的问题:我有一个使用一些Boost库的项目。有没有一种方法可以判断这些库是静态还是动态链接的? –

+1

@AlessandroPower:如果您使用的是类Unix系统,请在可执行文件上运行ldd。 –

+0

@AlessandroPower'boost'是仅标题库(期望某些特定的部分)。因此,大部分升压都不需要链接 – Garf365