2011-06-30 109 views
0

我有一個編譯問題。以下是文件和繼承。繼承makefile C++未定義符號第一次參考

dateType.h,dateTypeImp.cpp:定義和實現dateType類
addressType.h,addressTypeImp.cpp:定義和實現的AddressType類
personType.h,personTypeImp.cpp:定義和實現personType類
extPersonType .H,extPersonTypeImp.cpp:定義和實現extPersonType類
addressBookType.h,addressBookTypeImp.cpp:定義和實現addressBookType類

以下是繼承和具有-的關係。
extPersonType「擴展」(繼承)personType類,它也「有」每個addressType和dateType的一個對象。
addressBookType類「有」500個類型爲extPersonType的對象。
(我可以在需要的情況下複製粘貼.h文件)
因此,extPersonType.h在其中包含「dateType.h」,「addressType.h」,「personType.h」的#include語句。 addressBookType.h包含#include「extPersonType.h」。

我有下面的Makefile:

all: main 



personTypeImp.o: personTypeImp.cpp 
    g++ -c -Wall personTypeImp.cpp 

dateTypeImp.o: dateTypeImp.cpp 
    g++ -c -Wall dateTypeImp.cpp 

addressTypeImp.o: addressTypeImp.cpp 
    g++ -c -Wall addressTypeImp.cpp 

addressBookTypeImp.o: addressBookTypeImp.cpp 
    g++ -c -Wall addressBookTypeImp.cpp 

main.o: main.cpp 
    g++ -c -Wall main.cpp 

main: main.o addressBookTypeImp.o addressTypeImp.o dateTypeImp.o personTypeImp.o 
    g++ -Wall main.o addressBookTypeImp.o addressTypeImp.o dateTypeImp.o personTypeImp.o -o main 


clean: 
    rm -f *.o *~ main 

所有的.o線沒有出現任何錯誤。最後一個「主」編譯給出了這個錯誤:

make 
g++ -c -Wall main.cpp 
g++ -c -Wall addressBookTypeImp.cpp 
g++ -c -Wall addressTypeImp.cpp 
g++ -c -Wall dateTypeImp.cpp 
g++ -c -Wall personTypeImp.cpp 
g++ -Wall main.o addressBookTypeImp.o addressTypeImp.o dateTypeImp.o personTypeImp.o -o main 
Undefined      first referenced 
symbol        in file 
extPersonType::getStatus() const addressBookTypeImp.o 
extPersonType::isLastName(std::basic_string<char, std::char_traits<char>, std::allocator<char> >) constaddressBookTypeImp.o 

列出了extPersonType的更多功能。

想知道什麼可能是錯誤。

+0

請莫名其妙地重新格式化第2段。這很難遵循。 –

+0

@Caron格式化了前兩個段落。抱歉格式不正確。 – Romonov

回答

3

錯誤消息的關鍵部分是:

Undefined symbol extPersonType::... .

基本上,extPersonType類的符號是不屬於你的程序。如果你看一下makefile文件,你會看到

extPersonTypeImp.o: extPersonTypeImp.cpp 
    g++ -c -Wall extPersonTypeImp.cpp 

失蹤,你需要添加extPersonType.o到鏈接器命令這樣

g++ -Wall main.o addressBookTypeImp.o addressTypeImp.o dateTypeImp.o personTypeImp.o extPersonTypeImp.o -o main 
+0

@Caron謝謝你的建議。解決了這個問題。 – Romonov

2

那麼,你真的寫過這些函數的地方,或者只是宣佈他們?如果他們確實有身體,在什麼文件中,他們是否內聯?