一记劝、相同文件夾單文件
1、include “ ”引入
在A
文件夾里有A.h
,A.cc
,mainA.cc
三個(gè)文件
代碼
- ./A.h
#include <iostream>
class Afunc
{
public:
A();
};
- ./A.h
#include "A.h"
A::A()
{
std::cout<<#include "A()"<<std::endl;
}
- ./mainA.cc
#include "A.h"
int main()
{
A a;
return 0;
}
編譯指令:
-
g++ -o mainA mainA.cc
和g++ -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
所以這句話的意思是在
.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)加入狸膏。
-
g++ -o mainA mainA.cc A.cc
和g++ -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>
編譯指令
-
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)制定的目錄搜索
-
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)行編譯
-
g++ -o mianA main A.h A.cc
和g++ -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ò),提示未找到常柄。
-
#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 <>
,不加路徑
編譯指令
-
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" "引入
代碼
- ./A.h
#include <iostream>
#include <C.h>
class A
{
public:
A();
};
- ./A.cc
#include <A.h>
A::A()
{
C c;
std::cout<<"A()"<<std::endl;
}
- ./A/C/C.h
#include <iostream>
class C
{
public:
C();
};
- ./A/C/C.cc
#include <C.h>
C::C()
{
std::cout<<"C()"<<std::endl;
}
- ./mainA.cc
#include "A.h"
int main()
{
A a;
return 0;
}
文件的分布在路徑里有標(biāo)注弦牡。
所有的文件使用include <>
引入友驮。
編譯指令
-
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