【问题标题】:Including source files in C在 C 中包含源文件
【发布时间】:2010-11-28 03:54:35
【问题描述】:

所以我明白了标题与源文件的区别。我不明白编译器如何知道编译所有源文件。示例:

example.h

#ifndef EXAMPLE_H
#define EXAMPLE_H

int example(int argument); // prototype

#endif

example.c

#include "example.h"

int example(int argument)
    {
    return argument + 1; // implementation
    }

main.c

#include "example.h"

main()
    {
    int whatever;
    whatever = example(whatever); // usage in program
    }

当没有包含example.c时,编译main.c的编译器如何知道example()的实现?

这是某种 IDE 的东西,您可以在其中将文件添加到项目和东西中吗?有什么办法可以“手动”完成,因为我更喜欢纯文本编辑器而不是古怪的 IDE?

【问题讨论】:

    标签: c build header include


    【解决方案1】:

    用 C 或 C++ 编译实际上分为两个独立的阶段。

    • 编译
    • 链接

    编译器不知道 example() 的实现。它只知道在某个时候会定义一个名为 example() 的东西。所以它只是生成了带有占位符的代码,例如()

    然后链接器出现并解析这些占位符。

    要使用 gcc 编译代码,您需要执行以下操作

    gcc -c example.c -o example.o
    gcc -c main.c -o main.o
    gcc example.o main.o -o myProgram
    

    gcc 的前 2 次调用是编译步骤。第三次调用是链接器步骤。

    【讨论】:

    • 我认为你的意思是 gcc -c main.c -o main.o 在第 2 步中。
    【解决方案2】:

    是的,您必须告诉编译器(如果您不使用 IDE,通常通过 makefile)将哪些源文件编译成目标文件,然后编译器会单独编译每个源文件。然后,您将目标文件列表提供给链接器以组合到可执行文件中。如果链接器正在查找函数或类定义但找不到它,您将收到链接错误。

    【讨论】:

    • 这就是 makefile 的用武之地,一直想知道它们适合哪里。谢谢。
    【解决方案3】:

    它没有......你必须告诉它。
    例如,使用 gcc 时,首先要编译文件:

    gcc file1.c -c -ofile1.o
    gcc file2.c -c -ofile2.o
    

    然后编译器编译这些文件,假设您定义的符号(如您的示例函数)存在于某处并且稍后将被链接。 然后将目标文件链接在一起:

    gcc file1.o file2.o -oexecutable
    

    此时,链接器查看这些假设并“澄清”它们,即。检查它们是否存在。这就是它的基本工作原理......

    至于你的 IDE 问题,谷歌“makefiles”

    【讨论】:

    • 你的意思是-c,而不是-S,否则你不应该使用.o作为输出。
    【解决方案4】:

    编译 main.c 时编译器不知道 example() 的实现 - 编译器只知道头文件中包含的签名(如何调用它)。编译器生成 .o 目标文件,这些文件随后由链接器链接以创建可执行二进制文件。构建过程可以由 IDE 控制,或者如果您更喜欢 Makefile。 Makefile 具有独特的语法,需要一些学习才能理解,但会使构建过程更加清晰。如果你搜索 Makefile,网上有很多很好的参考资料。

    【讨论】:

      【解决方案5】:

      编译器没有。但是您的构建工具可以。 IDE 或make 工具。 手动方式是手工制作的Makefiles。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-05
        • 2020-11-03
        • 1970-01-01
        • 2020-03-26
        • 2010-09-18
        • 1970-01-01
        • 2014-11-18
        • 1970-01-01
        相关资源
        最近更新 更多