如何在C中链接多个实现文件

时间:2013-03-25 18:46:17

标签: c compilation header implementation

我有许多.c个文件,即实施文件说

  • 的main.c
  • A.C
  • B.c

来自任何文件的函数可以从不同的文件中调用任何函数。我的问题是,我是否需要一个.h头文件用于A和B的每个实现,其中每个头文件都有 ALL 定义A或B中的函数。

另外,main.c中会同时包含A.hB.h #included吗?

如果有人最终能说清楚,那么我如何在以后编译并运行终端中的多个文件。

感谢。

4 个答案:

答案 0 :(得分:21)

标题内容

A.h的标头A.c应仅包含使用A.c中定义的设施的外部代码所必需的信息。它不应该声明静态函数;它不应该声明静态变量;它不应声明内部类型(仅在A.c中使用的类型)。它应确保文件只能使用#include "A.h",然后充分利用A.c发布的工具。它应该是自包含的和幂等的(因此您可以包含它两次而不会出现任何编译错误)。您可以通过将#include "A.h"写为#include中的第一个A.c行来检查标头是否为自包含状态;你可以通过两次包含它来检查它是幂等的(但最好将它作为一个单独的测试来完成)。如果它不编译,则不是自包含的。同样适用于B.hB.c

有关标头和标准的详细信息,请参阅参考NASA编码标准的“Should I use #include in headers?”和“Linking against a static library”,其中包含我用于测试的脚本chkhdr自我遏制和幂等性。

链接

请注意,main.o取决于main.cA.hB.h,但main.c本身不依赖于标题。

编译时,您可以使用:

gcc -o program main.c A.c B.c

如果您需要其他选项,请添加它们(开头的大多数标志;最后的库,源代码之后)。您还可以将每个文件分别编译为目标代码,然后将目标文件链接在一起:

gcc -c main.c
gcc -c A.c
gcc -c B.c
gcc -o program main.o A.o B.o

答案 1 :(得分:3)

如果另一个.c文件中需要.c文件中声明的内容,则必须提供头文件。

一般来说,您可以为每个源文件都有一个头文件,您可以在其中导出所有已声明的函数或extern符号。

在实践中,您不会总是需要导出每个函数或每个变量,只需要导出另一个源文件所需的变量,并且您需要将其包含在所需的文件中(并且在源中与特定的头文件)。

当试图理解它是如何工作时只考虑每个源文件都是自己编译的事实,所以如果它将使用未在其源文件中直接声明的东西,那么它必须通过头文件声明文件。通过这种方式,编译器可以知道所有内容都存在且输入正确。

答案 2 :(得分:3)

这取决于编译器,但假设你使用的是gcc,你可以使用这样的东西:

gcc -Wall main.c A.c B.c -o myoutput

查看http://www.network-theory.co.uk/docs/gccintro/gccintro_11.html(第一个谷歌答案)了解更多详情。您可以将其编译为多个目标文件/库:

gcc -c main.c
gcc -c A.c
gcc -c B.c
gcc -o mybin main.o A.o B.o

答案 3 :(得分:0)

您要使用

gcc -g *.c -lm

它可以节省键入内容,并允许您链接项目中的所有c文件。