如何在C中链接多个实现文件
我有一些.c
文件,即实现文件说
- main.c中
- AC
- 公元前
来自任何文件的函数可以从不同的文件中调用任何函数。 我的问题是,我是否需要一个.h
ie头文件用于A和B的每个实现,其中每个头文件都有A或B中所有函数的定义。
另外,main.c会包含Ah
和Bh #included
吗?
如果有人能够最终说清楚,那么我如何在以后编译并运行终端中的多个文件。
谢谢。
标题内容
对于Ac
的标题Ah
应仅包含使用Ac
定义的设施的外部代码所必需的信息。 它不应该声明静态函数; 它不应该声明静态变量; 它不应声明内部类型(仅在Ac
使用的类型)。 它应该确保文件只能使用#include "Ah"
,然后充分利用Ac
发布的设施。 它应该是自包含的和幂等的(因此您可以包含它两次而不会出现任何编译错误)。 你可以通过写#include "Ah"
作为Ac
的第一个#include
行来检查标题是否是自包含的; 您可以通过将其包含两次来检查它是幂等的(但最好将其作为单独的测试完成)。 如果它不编译,则它不是自包含的。 Bh
和Bc
。
有关标头和标准的更多信息,请参阅“ 我是否应在标头中使用#include
? ‘,它引用了NASA编码标准,’ 链接到静态库 ‘,其中包括我用来测试自我控制和幂等性的脚本chkhdr
。
链接
请注意, main.o
依赖于main.c
, Ah
和Bh
,但main.c
本身不依赖于头文件。
在编译时,您可以使用:
gcc -o program main.c Ac Bc
如果您需要其他选项,请添加它们(开头的大多数标志;最后的库,源代码之后)。 您还可以将每个文件分别编译为目标代码,然后将目标文件链接在一起:
gcc -c main.c gcc -c Ac gcc -c Bc gcc -o program main.o Ao Bo
只要在另一个.c
文件中需要.c
文件中声明的内容,就必须提供头文件。
一般来说,您可以为每个源文件都有一个头文件,在该文件中导出所有声明的函数或extern
符号。
在实践中,您不会总是需要导出每个函数或每个变量,只需要导出另一个源文件所需的变量,并且您需要将其包含在所需的文件中(以及与特定头文件配对的源中) )。
当试图理解它是如何工作的时候只考虑每个源文件都是自己编译的事实,所以如果它将使用未在其源文件中直接声明的东西,那么它必须通过头文件声明。 通过这种方式,编译器可以知道所有内容都存在且输入正确。
它取决于编译器,但假设您使用的是gcc,您可以使用以下内容:
gcc -Wall main.c Ac Bc -o myoutput
请访问http://www.network-theory.co.uk/docs/gccintro/gccintro_11.html (第一个谷歌答案)了解更多详情。 您可以将其编译为多个目标文件/库:
gcc -c main.c gcc -c Ac gcc -c Bc gcc -o mybin main.o Ao Bo