gcc編譯器 多文件編譯

這個問題實(shí)際上是說,已知頭文件"a.h"聲明了一系列函數(shù)(僅有函數(shù)原型,沒有函數(shù)實(shí)現(xiàn)),"b.cpp"中實(shí)現(xiàn)了這些函數(shù),那么如果我想在"c.cpp"中使用"a.h"中聲明的這些在"b.cpp"中實(shí)現(xiàn)的函數(shù),通常都是在"c.cpp"中使用#include "a.h",那么c.cpp是怎樣找到b.cpp中的實(shí)現(xiàn)呢?
  其實(shí).cpp和.h文件名稱沒有任何直接關(guān)系,很多編譯器都可以接受其他擴(kuò)展名。

編譯器預(yù)處理時,要對#include命令進(jìn)行"文件包含處理":將headfile.h的全部內(nèi)容復(fù)制到#include "headfile.h"處。這也正說明了,為什么很多編譯器并不care到底這個文件的后綴名是什么----因為#include預(yù)處理就是完成了一個"復(fù)制并插入代碼"的工作。
  程序編譯的時候,并不會去找b.cpp文件中的函數(shù)實(shí)現(xiàn),只有在link的時候才進(jìn)行這個工作。我們在b.cpp或c.cpp中用#include "a.h"實(shí)際上是引入相關(guān)聲明,使得編譯可以通過,程序并不關(guān)心實(shí)現(xiàn)是在哪里,是怎么實(shí)現(xiàn)的。源文件編譯后成生了目標(biāo)文件(.o或.obj文件),目標(biāo)文件中,這些函數(shù)和變量就視作一個個符號。在link的時候,需要在makefile里面說明需要連接哪個.o或.obj文件(在這里是b.cpp生成的.o或.obj文件),此時,連接器會去這個.o或.obj文件中找在b.cpp中實(shí)現(xiàn)的函數(shù),再把他們build到makefile中指定的那個可以執(zhí)行文件中。

a.c a.h b.c中包含a.c的函數(shù) gcc -c b.c 當(dāng)a.c 文件不存在時編譯不通過 怎么回事?
自己寫錯了的緣故 把a(bǔ).h寫成了a.c
實(shí)際測試是對的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.項目經(jīng)驗 2.基礎(chǔ)問題 3.指南認(rèn)識 4.解決思路 ios開發(fā)三大塊: 1.Oc基礎(chǔ) 2.CocoaTouch...
    扶光啟玄閱讀 5,204評論 0 13
  • 前言 最近在學(xué)習(xí)#pragma編譯指令相關(guān)的知識,網(wǎng)上也有很多文章介紹各個指令的用法,但是在網(wǎng)上搜到的對#prag...
    小豬啊嗚閱讀 7,481評論 1 8
  • 概述:聲明是將一個名稱引入一個程序.定義提供了一個實(shí)體在程序中的唯一描述.聲明在單個作用域內(nèi)可以重復(fù)多次(類成員除...
    抓兔子的貓閱讀 699評論 0 3
  • Object-c的類可以多重繼承么?可以實(shí)現(xiàn)多個接口么?Category是什么?重寫一個類的方式用繼承好還是分類好...
    small_Sun閱讀 780評論 0 0
  • 淋風(fēng)在上 沐陽于下 才飛奔間隔之中 希望可以關(guān)注一下專題《詩意》,我們需要你對詩的態(tài)度,也需要你
    應(yīng)十四寒閱讀 282評論 0 31

友情鏈接更多精彩內(nèi)容