g 兩個關於標頭檔案編譯問題

2022-08-29 18:24:09 字數 2032 閱讀 4453

好吧,不得不說professor demko的c++ for fe 的project真是可以加速學習c++的好方法。當年本科時候在李文新老師的課上學c++最後也只是完成了poj上《魔獸世界》的大作業,而且只考慮了下派生類、友類和虛構函式。其他東西,呵呵,早都忘了嚕。

好了,廢話不多說,開始討論問題。

在 terminal中用g++編譯c++檔案,遇到兩個主要的問題,中文網頁中很少有所討論。滷煮在stackoverflow上倒是看到了不少這樣的討論,果然程式設計師的英文水平都很高》w<

標頭檔案中類的構建函式

樓主將乙個正態函式生成及相關計算的類寫入了乙個標頭檔案,該標頭檔案在其他檔案和主檔案中都會被呼叫。

標頭檔案的**如下

1

#ifndef _normdistintegral_h__

2#define _normdistintegral_h__34

/*generate normal distribution */5

6 #include 7 #include 8

9const

double pi = 3.1415926;10

11class

mynormdist12;

2223

#endif

與標頭檔案同名的cpp檔案中**如下,主要對頭檔案類中的函式內容進行編寫。

1 #include "

normdistintegral.h"2

3using

namespace

std;

45 mynormdist::mynormdist(double mean_, double

std_v_)610

11//

mynormdist::~mynormdist(){}

1213

/*省略以下描述函式**

*/

單獨對該cpp檔案進行g++編譯是完全沒有問題的。但是對主檔案進行編譯時(關聯其他o檔案),遇到了如下的問題。

undefined symbols for architecture x86_64:

"mynormdist::~mynormdist()", referenced from:

___tcf_2 in cashflow.o

___tcf_1 in bse.o

ld: symbol(s) not found for architecture x86_64

collect2: ld returned 1 exit status

好吧,他說我析構函式沒有找到。stackoverflow上給的解答是,析構函式的函式內容也應該在cpp檔案中寫出,而不應該省去。因為標頭檔案僅僅是對類及類中得變數、函式進行宣告。實際呼叫還是應該從cpp檔案中呼叫的,因此就算析構函式沒有具體內容,也應該在cpp檔案中寫出,即把上一段**中第11行的注釋dashes給去掉。

references:

2. 檔案呼叫

樓主還為主檔案編寫了個cpp檔案getcmt.cpp,其中包含函式 getcmt() 以冀在主檔案main.cpp和cashflow.cpp中直接呼叫。可是編譯主檔案時,又報出了如下的錯誤

ld

:duplicate symbol getcmt

()in cashflow

.o and main.o

forarchitecture x86_64

collect2

:ld returned

1exit status

好吧,stackoverflow上給出的答案是,在多個其他cpp檔案中直接用引用cpp檔案時候,該cpp檔案因為被多個檔案include,這些檔案的o檔案都會得到這個函式的複製件。c++是禁止對同一函式進行多次定義的,linker可能會對此報錯。

如何解決了,建議將這些函式體寫到乙個cpp檔案中,並建立乙個與cpp檔案同名的的標頭檔案,標頭檔案僅僅對cpp檔案中得函式進行宣告。在其他檔案中需要引用該函式的時候,include該標頭檔案即可。

reference:

Qt標頭檔案引入兩個namespace Ui的解釋

這個問題很好,乙個最簡單的qt專案中有4個檔案,我們來看看mainwindow.h和cpp的 include 這句話的意思,先宣告乙個在ui命名空間的名為mainwindow的未定義的的類,現在只是乙個宣告而已 namespace ui class mainwindow public qmainwi...

兩個類標頭檔案互相包含

c 中兩個類的標頭檔案互相包含問題 csdn部落格 我們知道,當乙個類 設類a 中包含另乙個類 設類b 的物件時,必須在該檔案中包含另乙個類的標頭檔案,如果兩個類都互用到了對方的物件,理論上就要互相包含標頭檔案,但是這樣是不可取的。貼出 如下 這樣是無法通過編譯的,其原因是它們的標頭檔案互相包含了,...

遇到的兩個編譯問題

最近遇到兩個編譯問題,著實費了一番功夫。我在乙個地方,定義了container of的巨集,卻屢次出現編譯錯誤 巨集定義如下 define container of ptr,type,member 報錯如下 error expected declaration specifiers or befor...