g++不同文件夾的編譯

一记劝、相同文件夾單文件

1、include “ ”引入

A文件夾里有A.h,A.cc,mainA.cc三個(gè)文件

代碼

  1. ./A.h
#include <iostream>
class Afunc
{
  public:
    A();
};
  1. ./A.h
#include "A.h"
A::A()
{
  std::cout<<#include "A()"<<std::endl;
}
  1. ./mainA.cc
#include "A.h"
int main()
{
  A a;
  return 0;
}

編譯指令:

  1. g++ -o mainA mainA.ccg++ -o mianA mainA.cc A.h
    報(bào)錯(cuò)
/tmp/ccaGpUEy.o: In function `main':
mainA.cc:(.text+0x1f): undefined reference to `A::A()'
collect2: error: ld returned 1 exit status

image.png

所以這句話的意思是在.text段中沒有找到A::A()的實(shí)現(xiàn)助泽。

后面的指令也也同樣提示楞慈,也就說(shuō)明旺嬉,g++并不會(huì)根據(jù)A.h文件,自動(dòng)去找它的實(shí)現(xiàn)A.cc本冲。
而這兩條命令相同准脂,說(shuō)明include " "引入的文件,會(huì)在當(dāng)前目錄搜索檬洞,并自動(dòng)加入狸膏。

  1. g++ -o mainA mainA.cc A.ccg++ -o mainA mainA.cc A.h A.cc
    編譯通過

說(shuō)明,A.h的實(shí)現(xiàn)文件A.cc需要顯式說(shuō)明疮胖,而A.h可以不用明確寫出环戈。

同時(shí)將include <iostream>改為include "iostream"也可以通過編譯
說(shuō)明,include " "引入的文件澎灸,會(huì)現(xiàn)在當(dāng)前目錄搜索院塞,然后在系統(tǒng)制定的目錄搜索。

2性昭、include <>引入

上面的目錄結(jié)構(gòu)不變拦止,將mainA.h中的#inlcude "A.h"改為#include <A.h>

編譯指令

  1. g++ -o mainA mainA.cc A.cc
    報(bào)錯(cuò)
mainA.cc:2:15: fatal error: A.h: No such file or directory
compilation terminated.

說(shuō)明include <>引入的文件,并不在當(dāng)前目錄搜索糜颠,只會(huì)在系統(tǒng)制定的目錄搜索

  1. g++ -o mainA mianA.cc A.cc -I ./
    編譯通過
g++ -I參數(shù)

-I可以將include <>原本的搜索目錄進(jìn)行擴(kuò)展汹族。
上面的語(yǔ)句表示將./也就是當(dāng)前目錄加入到其搜索目錄中。至于搜索順序其兴,后面討論顶瞒。。

如果同時(shí)將A.cc中的include “ ”也更改元旬,那么結(jié)果時(shí)相同的榴徐。
至于應(yīng)該使用哪種方式引入守问,實(shí)現(xiàn)文件,使用哪種方式坑资。還沒找到資料耗帕。
看過別人的庫(kù),是使用的include <>引入的袱贮。

二 不同文件夾 單文件

1仿便、include " "引入

代碼

將上面的mainA.cc文件,移出A文件夾攒巍,和A文件夾放在同一級(jí)嗽仪。

編譯

mianA.cc所在目錄進(jìn)行編譯

  1. g++ -o mianA main A.h A.ccg++ -o mainA mainA.cc A.cc
    報(bào)錯(cuò)
    分別提示
g++: error: A.cc: No such file or directory
g++: error: A.h: No such file or directory

g++: error: A.cc: No such file or directory

原因很簡(jiǎn)單,因?yàn)?code>include " "只會(huì)在當(dāng)前目錄和系統(tǒng)指定的目錄搜索窑业,這些文件夾不包含./A文件夾钦幔,所以報(bào)錯(cuò),提示未找到常柄。

  1. #include “A/A.h”+g++ -o mainA mainA.cc A/A.c A/A.cc
    編譯通過

include " "使用相對(duì)路徑引入,同時(shí)在編譯指令中顯式的指明文件的想對(duì)路徑搀擂。

必須采用既在include " "中標(biāo)明路徑西潘,也在編譯指令中標(biāo)明路徑的方式,兩者有一個(gè)沒有寫路徑哨颂,就會(huì)提示

g++: error: A.h: No such file or directory
g++: error: A.cc: No such file or directory

都會(huì)提示未找到喷市。
為什么要指定兩次?-L威恼、-I-l都不可以品姓。

include <>

代碼

mianA.cc中的include " " 改為include <>,不加路徑

編譯指令

  1. g++ -o main main A/A.h A/A.cc -I./A
    編譯通過

這種方式不需要在include <>中顯式的指明路徑箫措,但是在編譯指令中仍然需要指明路徑腹备。
而系統(tǒng)自帶的那些,并不需要在編譯指令中顯式指定斤蔓。
但是g++ -MM mainA.cc并沒有顯示A.h
所以植酥,但是這兩種方式應(yīng)該還是有區(qū)別的。

三 不同文件夾多文件

include" "引入

代碼

  1. ./A.h
#include <iostream>
#include <C.h>
class A
{
  public:
    A();
};
  1. ./A.cc
#include <A.h>
A::A()
{
  C c;
  std::cout<<"A()"<<std::endl;
}
  1. ./A/C/C.h
#include <iostream>
class C
{
  public:
    C();
};
  1. ./A/C/C.cc
#include <C.h>
C::C()
{
  std::cout<<"C()"<<std::endl;
}
  1. ./mainA.cc
#include "A.h"
int main()
{
  A a;
  return 0;
}

文件的分布在路徑里有標(biāo)注弦牡。
所有的文件使用include <>引入友驮。

編譯指令

  1. g++ -o mainA mainA.cc A/A.h A/A.cc A/C/C.h A/C/C.cc -IA -IA/C
    編譯通過。
    使用的是上面提到過的驾锰。使用-I將兩個(gè)路徑引入卸留,這樣編譯器可以搜索到。
    同時(shí)椭豫,如果將include <>改為include " "也是可以編譯通過的耻瑟。

改變代碼

改變mainA.cc代碼
./mainA.cc

#include "A.h"
#include "C.h"
int main()
{
  A a;
  C c;
  return 0;
}

這樣旨指,C.h就是重復(fù)引用。報(bào)錯(cuò)

In file included from mainA.cc:3:0:
A/C/C.h:2:7: error: redefinition of ‘class C’
 class C
       ^
In file included from A/A.h:2:0,
                 from mainA.cc:2:
A/C/C.h:2:7: error: previous definition of ‘class C’
 class C

為了解決這個(gè)問題匆赃,所以在定義類的時(shí)候都使用如下的預(yù)處理

#ifndef C_H
#define C_H
class C
{

}
#endif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末淤毛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子算柳,更是在濱河造成了極大的恐慌低淡,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,406評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瞬项,死亡現(xiàn)場(chǎng)離奇詭異蔗蹋,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)囱淋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門猪杭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人妥衣,你說(shuō)我怎么就攤上這事皂吮。” “怎么了税手?”我有些...
    開封第一講書人閱讀 167,815評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵蜂筹,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我芦倒,道長(zhǎng)艺挪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,537評(píng)論 1 296
  • 正文 為了忘掉前任兵扬,我火速辦了婚禮麻裳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘器钟。我一直安慰自己津坑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評(píng)論 6 397
  • 文/花漫 我一把揭開白布俱箱。 她就那樣靜靜地躺著国瓮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪狞谱。 梳的紋絲不亂的頭發(fā)上乃摹,一...
    開封第一講書人閱讀 52,184評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音跟衅,去河邊找鬼孵睬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛伶跷,可吹牛的內(nèi)容都是我干的掰读。 我是一名探鬼主播秘狞,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蹈集!你這毒婦竟也來(lái)了烁试?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,668評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤拢肆,失蹤者是張志新(化名)和其女友劉穎减响,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體郭怪,經(jīng)...
    沈念sama閱讀 46,212評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡支示,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鄙才。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颂鸿。...
    茶點(diǎn)故事閱讀 40,438評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖攒庵,靈堂內(nèi)的尸體忽然破棺而出嘴纺,到底是詐尸還是另有隱情,我是刑警寧澤浓冒,帶...
    沈念sama閱讀 36,128評(píng)論 5 349
  • 正文 年R本政府宣布颖医,位于F島的核電站,受9級(jí)特大地震影響裆蒸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜糖驴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評(píng)論 3 333
  • 文/蒙蒙 一僚祷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贮缕,春花似錦辙谜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至定嗓,卻和暖如春蜕琴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宵溅。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工凌简, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人恃逻。 一個(gè)月前我還...
    沈念sama閱讀 48,827評(píng)論 3 376
  • 正文 我出身青樓雏搂,卻偏偏與公主長(zhǎng)得像藕施,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子凸郑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容