C中的库是静态链接的吗?

C中的库是静态链接的吗?,c,static-libraries,C,Static Libraries,我开始在Rust中编程,我注意到的第一件事是Rust生成大型二进制文件。例如,Rust的Hello world!二进制文件的大小约为600K,而等效的C二进制文件的大小约为8K 经过一些搜索,我找到了一篇文章,这篇文章解释了Rust二进制文件很大,因为所有需要的库都是静态链接的。但这不是C的情况吗?当我在C中编写include时,我不是也静态链接相关的I/O库吗?我一直认为答案是“是”,但现在我怀疑自己。include将文件内容复制到源文件,但如果头只是函数声明,那么只需告诉程序这些函数可以在代

我开始在Rust中编程,我注意到的第一件事是Rust生成大型二进制文件。例如,Rust的Hello world!二进制文件的大小约为600K,而等效的C二进制文件的大小约为8K

经过一些搜索,我找到了一篇文章,这篇文章解释了Rust二进制文件很大,因为所有需要的库都是静态链接的。但这不是C的情况吗?当我在C中编写include时,我不是也静态链接相关的I/O库吗?我一直认为答案是“是”,但现在我怀疑自己。

include将文件内容复制到源文件,但如果头只是函数声明,那么只需告诉程序这些函数可以在代码中调用即可。实际实现可能在另一个文件中定义,该文件需要静态或动态链接到可执行文件。如果您查看标题,您会发现它只包含函数原型

许多编译器提供了对标准库进行静态或动态链接的选项。

include将文件内容复制到源文件,但如果头只是函数声明,那么只需告诉程序这些函数可在代码中调用即可。实际实现可能在另一个文件中定义,该文件需要静态或动态链接到可执行文件。如果您查看标题,您会发现它只包含函数原型


许多编译器提供了对标准库进行静态或动态链接的选项。

不,不一定。通常-l表示.so文件的动态链接。链接不同于头文件包含。include不是一个链接命令/语句。否,静态链接和动态链接是您选择的选项。@callyalater基本上不包括复制并粘贴库到源文件中?也许我的密度太大了,但我看不出这样做不会静态链接库。include会将文件内容复制到源文件,但如果头只是函数声明,那么只需告诉程序这些函数可以在代码中调用即可。实际实现可能在另一个文件中定义,该文件需要静态或动态链接到可执行文件。如果你看一下标题,你会发现它只包含函数原型。不,不总是这样。通常-l表示.so文件的动态链接。链接不同于头文件包含。include不是一个链接命令/语句。否,静态链接和动态链接是您选择的选项。@callyalater基本上不包括复制并粘贴库到源文件中?也许我的密度太大了,但我看不出这样做不会静态链接库。include会将文件内容复制到源文件,但如果头只是函数声明,那么只需告诉程序这些函数可以在代码中调用即可。实际实现可能在另一个文件中定义,该文件需要静态或动态链接到可执行文件。如果你看一下标题,你会发现它只包含函数原型。谢谢。最后一个问题:我有一个使用一些Boost库的项目。有什么方法可以告诉我这些库是静态链接的还是动态链接的?@AlessandroPower:如果您使用的是类Unix系统,请在可执行文件上运行ldd。@AlessandroPower boost是只包含头的库,需要一些特定的部分。因此,不需要链接,大多数最高级的提升库都是C++使用的。因为它们倾向于为类和函数使用模板,所以它们是仅头库,只需要在代码中包含boost_header_file.hpp文件。一些库,如正则表达式、文件系统和boost_线程,在使用前需要作为库进行预编译,但您可以将它们编译为静态库或动态库,我已经完成了这两个库的编译,并相应地链接它们。您可以在上阅读有关哪些库需要预编译的更多信息。谢谢。最后一个问题:我有一个使用一些Boost库的项目。有什么方法可以告诉我这些库是静态链接的还是动态链接的?@AlessandroPower:如果您使用的是类Unix系统,请在可执行文件上运行ldd。@AlessandroPower boost是只包含头的库,需要一些特定的部分。因此,不需要链接,大多数最高级的提升库都是C++使用的。因为它们倾向于为类和函数使用模板,所以它们是仅头库,只需要在代码中包含boost_header_file.hpp文件。某些库(如regex、文件系统和boost_线程)在使用前需要作为库进行预编译,但您可以将它们编译为静态或动态库
我已经完成了这两个库,并相应地链接了它们。您可以在上阅读更多关于哪些库需要预编译的信息。