鱼C论坛

 找回密码
 立即注册
查看: 806|回复: 2

[已解决]请教有关编译过程的机制的问题

[复制链接]
发表于 2023-5-12 03:54:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我写一个.c文件,我看书上和网上的步骤都是说,要先经过预处理,然后再编译、汇编,最后链接成一个可执行的.out文件
.c -> .i -> .s -> .o -> .out
可是我看有人说可以 .c 直接一步到位到 .o,能不能直接到 .out 我不知道,但是经过我自己的尝试,.o 能直接到 .s,里面的汇编代码和从 .i 变到 .s 的没有区别,并且 .o 文件直接编译成 .s 文件时它也会在这这一步检查代码的合法性
那 .o 文件直接编译成 .s 和  .o -> .i ->.s这两种方式有什么区别吗?直接跳到.o这种呢?如果没区别那前面的步骤岂不是除了可以作为学习的方式没什么实际意义了,

还请教大佬们一个小小的问题,我是纯新手= =,这个gcc是只有编译功能,然后编辑代码需要借助vim,调试需要借助GDB这样子吗?
因为以前我都在win下用的vs,刚刚接触linux,我一开始以为直接可以用gcc编辑、编译、debug一体
最佳答案
2023-5-12 03:54:37
首先,编译过程包括预处理、编译、汇编和链接四个阶段。预处理阶段将源代码中的预处理指令展开,生成.i文件;编译阶段将预处理后的代码翻译成汇编代码,生成.s文件;汇编阶段将汇编代码翻译成机器码,生成.o文件;链接阶段将多个目标文件以及库文件合并成一个可执行文件,生成.out文件。这是一个标准的编译过程,确保了代码的正确性和可执行性。

至于直接将.c文件编译成.o文件,这是因为现代编译器具有优秀的预处理和优化能力,可以直接将源代码编译成目标文件,这种方式称为“单编译单链接”。但是,这种方式会导致编译速度变慢,而且无法使用静态库和动态库。因此,多数情况下,我们还是采用标准的编译过程。

至于您的第二个问题,gcc确实只是一个编译器,它不能像VS那样提供代码编辑和调试功能。在Linux下,您可以使用vim或其他编辑器进行代码编辑,使用GDB进行调试。当然,也可以使用一些集成开发环境(IDE),如Eclipse、Code::Blocks等,它们提供了编辑、编译、调试等功能。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-12 03:54:37 | 显示全部楼层    本楼为最佳答案   
首先,编译过程包括预处理、编译、汇编和链接四个阶段。预处理阶段将源代码中的预处理指令展开,生成.i文件;编译阶段将预处理后的代码翻译成汇编代码,生成.s文件;汇编阶段将汇编代码翻译成机器码,生成.o文件;链接阶段将多个目标文件以及库文件合并成一个可执行文件,生成.out文件。这是一个标准的编译过程,确保了代码的正确性和可执行性。

至于直接将.c文件编译成.o文件,这是因为现代编译器具有优秀的预处理和优化能力,可以直接将源代码编译成目标文件,这种方式称为“单编译单链接”。但是,这种方式会导致编译速度变慢,而且无法使用静态库和动态库。因此,多数情况下,我们还是采用标准的编译过程。

至于您的第二个问题,gcc确实只是一个编译器,它不能像VS那样提供代码编辑和调试功能。在Linux下,您可以使用vim或其他编辑器进行代码编辑,使用GDB进行调试。当然,也可以使用一些集成开发环境(IDE),如Eclipse、Code::Blocks等,它们提供了编辑、编译、调试等功能。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-12 15:44:37 | 显示全部楼层
isdkz 发表于 2023-5-12 03:54
首先,编译过程包括预处理、编译、汇编和链接四个阶段。预处理阶段将源代码中的预处理指令展开,生成.i文件 ...

明白了,蟹蟹蟹蟹
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-21 23:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表