gpt4 book ai didi

c - 通过cmd将C文件与gcc合并

转载 作者:太空宇宙 更新时间:2023-11-04 08:40:22 26 4
gpt4 key购买 nike

我在想如何创建一个包含超过1c文件的exe。。
假设我有两个c文件,第一个叫做main.c,第二个叫做hello.c。
主.c文件是这样的。。。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{

hello();
return 0;

}

你好,c是这样的。。。
#include <stdio.h>
#include <stdlib.h>

void hello(void)
{
printf("Hello...");
}

我的主.c文件将如何从另一个文件中读取hello()函数,以及如何编译这些文件并使用gcc生成可执行文件。。
我现在知道的步骤是(使用1c文件),我打开cmd。。进入我的项目文件夹。。路径%path%带有我的编辑器的bin文件夹,然后是gcc main.c和-o程序名称,我得到我的exe。。
所以我怎样才能把上面的两个c文件合并成一个

最佳答案

“至于怎么做,”巴尔马已经回答正确了,

gcc -o programname main.c hello.c

将编译所有文件并将它们链接在一起。
但我认为你对它的工作方式更感兴趣。
检查以下两个问题 How does the compilation/linking process work? How does C++ linking work in practice?
我也会在这里简单解释。。。
本质上,命令 gcc不仅仅是一个编译器,而是它们所称的驱动程序。它将使文件 main.chello.c经过多个处理阶段,并帮助从所有源代码中生成可执行文件。
基于 gcc得到两个 .c文件作为参数的事实,它将推断您希望同时使用 main.chello.c中的代码来生成可执行程序。
它将首先通过预处理、编译和组装阶段分别获取这两个文件。然后它将运行链接器并向其输入两个文件。
预处理只是扩展宏,比如 #include#define
编译是操作的核心,gcc读取c文件并从中生成语法树,它可能会根据传递的其他优化参数尝试优化它,然后为每个c文件编写一个文本文件。这些文本文件是用c编写的函数的汇编语言表示。
编译也是gcc编译器 cc1遇到 main.c中调用 hello();的代码行的地方,并想知道 hello是什么,它在哪里。告诉编译器 hello是将在别处定义的函数的方法称为前向声明。这就是它的工作原理
void hello(void);

int main(void){
hello();
...

现在当 cc1遇到对 hello()的调用时,它理解为有耐心,只需将其标记为最终必须找到的符号 hello的引用。
转发声明的最佳实践是将它们放在头文件中,通常与代码所在的c文件同名。
所以你要做一个 hello.h(就像@Barmar已经说过的)它会读到
void hello(void);

然后在 main.c中有一个 #include指令,如下所示。。。
#include "hello.h"

int main(void){
...

现在 hello.h中的正向声明将在预处理时复制到c代码中。
在汇编器阶段 gcc调用 as汇编器实用程序,它实际上不是gcc包的一部分,而是 binutils包的一部分。这个实用程序将获取汇编语言文本并生成扩展名为 .o的二进制对象文件( hello.omain.o)。这些文件包含与 main.chello.c中定义的每个函数相关的机器级指令。
最后,问题的真正答案在于链接器 ld另一个实用程序是 binutils包的一部分。链接器将首先完成一个简单的任务,将来自不同 .o文件的所有代码组合成一个文件,最终成为可执行文件。链接器能够获取两个或多个 .o文件,检查机器代码并查找对外部对象的引用。。例如, main.o中的代码引用了 hello.o文件中的函数。在 main.o文件中,这被记录为对符号的引用,但是现在链接的可以实际找到该符号,因此它将把该引用与实际的代码对象连接起来。这个过程称为静态链接。
最后,当你运行一个程序时,机器代码被加载,这实际上是一组函数对象,函数对象之间的引用在那时是硬连接的,这取决于函数最终部署的内存地址。
我可能在我的解释中走了很多弯路,但希望你能理解其中的要点,并能在你的探索中前进,了解事情是如何运作的。
高温高压

关于c - 通过cmd将C文件与gcc合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23971676/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com