【问题标题】:How to link multiple implementation files in C如何在C中链接多个实现文件
【发布时间】:2013-03-15 09:11:34
【问题描述】:

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

  • main.c
  • 交流
  • 公元前

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

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

如果有人终于可以说清楚,还有,我以后如何在终端中编译和运行多个文件。

谢谢。

【问题讨论】:

    标签: c compilation header implementation


    【解决方案1】:

    你想用

    gcc -g *.c -lm
    

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

    【讨论】:

      【解决方案2】:

      标题内容

      A.c 的标头A.h 应该只包含使用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
      

      【讨论】:

        【解决方案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
        

        【讨论】:

          【解决方案4】:

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

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

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

          当试图理解它是如何工作的时候,想想每个源文件都是自己编译的,所以如果它要使用没有在源文件中直接声明的东西,那么它必须通过头文件来声明文件。通过这种方式,编译器可以知道所有内容都存在并且类型正确。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-03-03
            • 1970-01-01
            • 1970-01-01
            • 2017-08-29
            • 1970-01-01
            • 1970-01-01
            • 2019-04-27
            相关资源
            最近更新 更多