gcc编译器 多文件编译

这个问题实际上是说,已知头文件"a.h"声明了一系列函数(仅有函数原型,没有函数实现),"b.cpp"中实现了这些函数,那么如果我想在"c.cpp"中使用"a.h"中声明的这些在"b.cpp"中实现的函数,通常都是在"c.cpp"中使用#include "a.h",那么c.cpp是怎样找到b.cpp中的实现呢?
  其实.cpp和.h文件名称没有任何直接关系,很多编译器都可以接受其他扩展名。

编译器预处理时,要对#include命令进行"文件包含处理":将headfile.h的全部内容复制到#include "headfile.h"处。这也正说明了,为什么很多编译器并不care到底这个文件的后缀名是什么----因为#include预处理就是完成了一个"复制并插入代码"的工作。
  程序编译的时候,并不会去找b.cpp文件中的函数实现,只有在link的时候才进行这个工作。我们在b.cpp或c.cpp中用#include "a.h"实际上是引入相关声明,使得编译可以通过,程序并不关心实现是在哪里,是怎么实现的。源文件编译后成生了目标文件(.o或.obj文件),目标文件中,这些函数和变量就视作一个个符号。在link的时候,需要在makefile里面说明需要连接哪个.o或.obj文件(在这里是b.cpp生成的.o或.obj文件),此时,连接器会去这个.o或.obj文件中找在b.cpp中实现的函数,再把他们build到makefile中指定的那个可以执行文件中。

a.c a.h b.c中包含a.c的函数 gcc -c b.c 当a.c 文件不存在时编译不通过 怎么回事?
自己写错了的缘故 把a.h写成了a.c
实际测试是对的

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.项目经验 2.基础问题 3.指南认识 4.解决思路 ios开发三大块: 1.Oc基础 2.CocoaTouch...
    阳光的大男孩儿阅读 10,468评论 0 13
  • 前言 最近在学习#pragma编译指令相关的知识,网上也有很多文章介绍各个指令的用法,但是在网上搜到的对#prag...
    小猪啊呜阅读 12,024评论 1 8
  • 概述:声明是将一个名称引入一个程序.定义提供了一个实体在程序中的唯一描述.声明在单个作用域内可以重复多次(类成员除...
    抓兔子的猫阅读 3,821评论 0 3
  • Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好...
    small_Sun阅读 4,032评论 0 0
  • 淋风在上 沐阳于下 才飞奔间隔之中 希望可以关注一下专题《诗意》,我们需要你对诗的态度,也需要你
    应十四寒阅读 1,722评论 0 31