打印
[技术问答]

C语言的编译、链接、标题和符号

[复制链接]
173|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
AdaMaYun|  楼主 | 2024-3-12 13:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式



下面是一些关于如何编译 C 语言的基础知识。

C 语言的代码是用源文件 .c 编写的。每个源文件都会被编译成一个目标文件.o,这个文件就像一个容器装载了.c文件中编译后的函数。但这些函数是不可执行的。目标文件内部有一个符号表,这些符号是该文件中定义的全局函数和变量的名称。

# compile to objects
cc -c thing.c -o thing.o
cc -c stuff.c -o stuff.o

源文件之间是完全独立的,可并行编译成对象。

如果想跨文件调用函数和变量,则必须使用头文件(.h)。这些文件也是 C 源文件,只不过使用方式比较特殊。回顾一下,目标文件只包含全局函数和变量的名称,没有类型、宏,甚至没有函数参数。如果想跨文件使用这些符号,就需要指定额外的信息。我们将这些“声明”单独放在 .h 文件中,然后由其他 .c 文件通过 #include 包含进来。

为避免重复,通常 .c 文件不会定义自己的类型/宏等,而是只包含自己或自己所属的模块或组件的头文件。

你可以将头文件视为 API 的规范,只不过实现可以放在多个源文件中。你甚至可以在同一个头文件中实现不同的平台或目的。

关注公众号:C语言中文社区,免费领取500G编程资料

如果编译时遇到一个只有声明(例如通过头文件)、没有定义的符号引用时,编译出的目标文件会将其标记为缺失需要填补。

最终的这部分工作由编译器的“链接器”组件完成,由它负责将一个或多个对象连接在一起,匹配所有的符号引用,然后输出完整的可执行文件或共享库。

# link objects to executable
cc thing.o stuff.o -o gizmo

概括起来,C语言的源文件中不能包含其他源文件,只能包括声明,然后由链接器完成匹配。

使用特权

评论回复
沙发
zwsam| | 2024-3-31 08:21 | 只看该作者
good

使用特权

评论回复
板凳
星辰大海不退缩| | 2024-4-17 19:18 | 只看该作者
C 语言的代码是用源文件 .c 编写的。每个源文件都会被编译成一个目标文件.o,这个文件就像一个容器装载了.c文件中编译后的函数。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

177

主题

1274

帖子

3

粉丝