c语言文件组织与多文件gcc命令行编译

c语言文件组织与gcc命令行编译

最近在学习操作系统,关系到一些c语言文件组织,利用基本的编译链接等等的知识,简单记录如下

文件组织

通过实践出真知,记录如下:
编写文件:hello.c hello.h myfunc.c
如果理解透彻:预处理,编译(汇编),链接
就会比较清楚。
myfunc.c包含了自己定义的各种函数主体,注意它虽然不需要被“运行”,但需要被编译,所以该有的都得有,用到了什么头文件、标准库,都需要正确写在前面。
hello.h 包含了myfunc.c中所有函数的声明,此头文件不被编译
hello.c 是主体文件,它包含了其他需要的标准库,和hello.h。注意预处理阶段就是简单地把头文件附在文件前面,所以hello.h中只要有后面用到的函数的声明,经过预处理,就可以通过编译。

#include 
#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 

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).
如下图。

c语言文件组织与多文件gcc命令行编译_第1张图片

你可能感兴趣的:(c语言,开发语言)