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

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

命令行操作如下

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值