c语言文件组织与gcc命令行编译
最近在学习操作系统,关系到一些c语言文件组织,利用基本的编译链接等等的知识,简单记录如下
文件组织
通过实践出真知,记录如下:
编写文件:hello.c hello.h myfunc.c
如果理解透彻:预处理,编译(汇编),链接
就会比较清楚。
myfunc.c包含了自己定义的各种函数主体,注意它虽然不需要被“运行”,但需要被编译,所以该有的都得有,用到了什么头文件、标准库,都需要正确写在前面。
hello.h 包含了myfunc.c中所有函数的声明,此头文件不被编译
hello.c 是主体文件,它包含了其他需要的标准库,和hello.h。注意预处理阶段就是简单地把头文件附在文件前面,所以hello.h中只要有后面用到的函数的声明,经过预处理,就可以通过编译。
#include <stdio.h>
#include "hello.h"
int main()
{
printf("Hello!\n");
myfunc1();
myfunc2();
return 0;
}
hello.c
#ifndef _HELLOH_
#define _HELLOH_
void myfunc1();
void myfunc2();
#endif
这是hello.h
#include <stdio.h>
void myfunc1()
{
printf("My Function1\n");
}
void myfunc2()
{
printf("My Function2\n");
}
这是myfunc.c
gcc命令行编译
注意,因为是多个文件,命令行gcc不能帮你做链接的事情,vscode配置好环境或者vs studio项目中打开可以做。
如果不链接,直接gcc hello.c -o hello
那么虽然能通过编译(因为预处理加上头文件后,函数被正确声明),但是运行时发现,那些函数找不到。
这是很显然的,就相当于函数声明在main前面能过编译,但是要是后面没有主体,那根本没法执行。
这需要链接,因此需要先把两个c文件都生成可执行文件,再链接。
这也是比较有趣的地方,hello.c中并没有包含myfunc.c,仅仅有hello.h,而hello.h中并没有函数主体。但是通过链接,就可以正确的把函数主体找到并链接进去。
gcc把编译和汇编都做好了 ,因此直接生成二进制文件了(.o).
如下图。