【问题标题】:What is the difference compiling gcc .c file in comparison to making a .c file into an .o file and linking and assembling?编译 gcc .c 文件与将 .c 文件制作成 .o 文件并链接和汇编有什么区别?
【发布时间】:2015-02-22 01:53:31
【问题描述】:

我刚刚开始参与 GCC。

假设我们有一个由 vim labaled helloworld.c 编写的文本文件

为什么 SWIM(不是我的人)用

编译它

gcc helloworld.c 对比 gcc -c helloworld.cgcc -o helloWorld helloworld.o

【问题讨论】:

  • 我相信你需要修改这个问题,因为“gcc -c helloworld.c”被重复了,你到目前为止没有使用链接器
  • 如果您将多个文件组合成一个可执行文件,可能是从汇编程序、c 等编译而成,然后编译为目标文件,然后将目标文件链接到可执行文件中。如果您只有一个(或几个)c 源并且不需要目标文件,那么只需一步编译/链接。
  • 我假设第一个命令不应该有-c 选项?两种方式之间的唯一区别是,对于第一个命令,目标文件的生成和链接是在幕后完成的。但它仍然在做同样的事情。
  • 实际上 SWIY(不是你的人)会使用 gcc -Wall helloworld.c -o helloworld 编译它,以便获得一些额外的错误检查,以及具有首选名称的可执行文件。
  • 修订完成。我不知道 -Wall。

标签: c linux gcc vim compilation


【解决方案1】:

对于一个单一的文件,没有任何用处。 但是如果你编译一个更大的项目,你可能不想重新编译所有文件,如果你只改变了一个文件。从而获得编译时间。

使用中间 .o 文件让您只重新编译需要重新编译的内容,并将最终二进制文件与所有这些对象文件链接。

另一个用例是如果您想使用自定义链接脚本,例如选择部分或代码的位置。然后你需要从.o文件中获取实际代码。

【讨论】:

  • 在实践中,对于具有多个.c 源文件的项目,您希望使用像make 这样的构建器。请参阅here 了解原因!
【解决方案2】:

编译过程有几个阶段:

预处理 -> 编译 -> 组装 -> 链接。

阶段:

  • 预处理:将 .h 文件中的一些测试包含到 .c 文件中,并创建预处理的源代码。
  • 编译:从您的预处理代码创建汇编代码。
  • 汇编:从您的汇编代码创建目标模块。
  • 链接:从您的目标模块创建可执行文件。

当你使用gcc [options]时:

如果你使用:

  • gcc -E 在预处理阶段后停止并为您提供预处理代码。
  • gcc -S 在编译阶段后停止并为您提供汇编代码。
  • gcc -c 在组装阶段后停止并为您提供一个对象模块。

gcc -o 给你一个包含名字的可执行文件,默认给你a.out

man gcc HERE

【讨论】:

    猜你喜欢
    • 2022-10-24
    • 2023-03-08
    • 2013-09-04
    • 2023-03-25
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    相关资源
    最近更新 更多