继承makefile C++未定义符号首先被引用

Posted

技术标签:

【中文标题】继承makefile C++未定义符号首先被引用【英文标题】:inheritance makefile C++ undefined symbol first referenced 【发布时间】:2011-06-30 03:27:45 【问题描述】:

我遇到了编译问题。以下是文件和继承。

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类

以下是继承和has-the关系。 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 的更多函数。

想知道可能是什么错误。

【问题讨论】:

请以某种方式重新格式化前 2 段。真的很难跟上。 @Caron 格式化了前两段。抱歉格式错误。 【参考方案1】:

错误信息的关键部分是:

未定义符号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

【讨论】:

【参考方案2】:

那么,您是否真的在某处编写了这些函数,或者只是简单地声明了它们?如果它们确实有正文,在什么文件中,它们是内联的吗?

【讨论】:

以上是关于继承makefile C++未定义符号首先被引用的主要内容,如果未能解决你的问题,请参考以下文章

使用文件夹结构时的 C++ 未定义符号

c++类继承,未定义引用'Class::Constructor()'

未定义的引用,继承问题 - C++ [重复]

c++ 继承问题:未定义对“vtable”的引用

C++ 类和继承错误:未定义对派生类的引用

使用 bjam 编译的来自 C++ 的未定义符号