C++ 导致vtable错误的Makefile设置
我正在尝试制作一个简单的程序,其中我使用了模板和继承。 我正在使用LinuxGCC。然而,在EclipseCDT中,如果我只给出自己的makefile,我会得到一个关于vtable未定义引用的错误。另一方面,如果我选中buildiegenerate makefile automatically中的选项,错误就会消失。有人能指出可能的错误吗 下面是我的类,带有标题和makefile AbstractVehicleFactory.h:C++ 导致vtable错误的Makefile设置,c++,makefile,C++,Makefile,我正在尝试制作一个简单的程序,其中我使用了模板和继承。 我正在使用LinuxGCC。然而,在EclipseCDT中,如果我只给出自己的makefile,我会得到一个关于vtable未定义引用的错误。另一方面,如果我选中buildiegenerate makefile automatically中的选项,错误就会消失。有人能指出可能的错误吗 下面是我的类,带有标题和makefile AbstractVehicleFactory.h: class AbstractVehicleFactory { p
class AbstractVehicleFactory {
public:
AbstractVehicleFactory() {}
virtual ~AbstractVehicleFactory() {}
IVehicle* getVehicle();
virtual IVehicle* createVehicle() = 0;
private:
IVehicle* mVehicle;
};
AbstractVehicleFactory.cpp
IVehicle* AbstractVehicleFactory::getVehicle() {
if(!mVehicle) {
mVehicle = createVehicle();
}
return mVehicle;
}
标准车辆.h:
#include "AbstractVehicleFactory.h"
template<typename T>
class StandardVehicle: public AbstractVehicleFactory {
public:
StandardVehicle();
virtual ~StandardVehicle();
protected :
IVehicle* createVehicle();
private:
T* mVehicle;
};
#包括“AbstractVehicleFactory.h”
模板
类别标准车辆:公共抽象车辆工厂{
公众:
标准车辆();
虚拟汽车(;
受保护的:
IVehicle*创建车辆();
私人:
T*mVehicle;
};
StandardVehicle.cpp:
template<typename T>
StandardVehicle<T>::StandardVehicle() {
mVehicle = 0;
}
template<typename T>
StandardVehicle<T>::~StandardVehicle() {
}
template<typename T>
IVehicle* StandardVehicle<T>::createVehicle() {
return new T();
}
Makefile:
# compiler
CXX = g++
CXXFLAGS = -O2 -g -Wall -fmessage-length=0
SOURCES= $(wildcard *.cpp)
OBJECTS= $(SOURCES:.cpp=.o)
TARGET= Vehicle.exe
$(TARGET): $(OBJECTS)
$(CXX) -o $(TARGET) $(OBJECTS) $(LIBS) $(LDFLAGS)
all: $(SOURCES) $(TARGET)
clean:
rm -f $(OBJECTS) $(TARGET)
Error:
g++ -o Vehicle.exe AbstractVehicleFactory.o Bus.o FactoryPattern.o IVehicle.o StandardVehicle.o
AbstractVehicleFactory.o:(.rodata._ZTV22AbstractVehicleFactory[vtable for AbstractVehicleFactory]+0x10): undefined reference to `AbstractVehicleFactory::createVehicle()'
collect2: ld returned 1 exit status
make: *** [Vehicle.exe] Error 1
模板
StandardVehicle::StandardVehicle(){
mVehicle=0;
}
模板
StandardVehicle::~StandardVehicle(){
}
模板
IVehicle*StandardVehicle::createVehicle(){
返回新的T();
}
生成文件:
#编译程序
CXX=g++
CXXFLAGS=-O2-g-Wall-fmessage长度=0
源=$(通配符*.cpp)
对象=$(源:.cpp=.o)
目标=Vehicle.exe
$(目标):$(对象)
$(CXX)-o$(目标)$(对象)$(库)$(LDFLAGS)
全部:$(来源)$(目标)
清洁:
rm-f$(对象)$(目标)
错误:
g++-o Vehicle.exe AbstractVehicleFactory.o Bus.o FactoryPattern.o IVehicle.o StandardVehicle.o
AbstractVehicleFactory.o:(.rodata.\u ZTV22AbstractVehicleFactory[vtable for AbstractVehicleFactory]+0x10):对“AbstractVehicleFactory::createVehicle()”的未定义引用
collect2:ld返回了1个退出状态
make:**[Vehicle.exe]错误1
有人能指出可能的错误吗
编辑:即使在检查makefile generate automatically之后,我也会在StandardVehicle构造函数上得到错误作为未定义的引用。StandardVehicle.o也未显示任何部件。它不是正常构建的吗?您的代码说:
public:
StandardVehicle() ;
你不能这样做,因为这是一个模板。你必须把尸体放在那里
以后在另一个cpp文件中使用模板时,如下所示:
StandardVehicle<int> myvar ;
标准车辆myvar;
编译器将立即生成
StandardVehicle
的所有代码,因此它不能引用StandardVehicle中的代码。cpp您能在问题中找出哪些代码属于哪些编译单元/头文件吗?它只是一个包含所有这些文件的文件夹。除此之外,还有汽车班和公共汽车班。它们分别是接口和最终产品,工厂应根据定义的模板类返回最终产品。就像这个AbstractVehicleFactory*a=新标准车辆();i车辆*v=a->createVehicle();我一直要求您指出哪个代码位于哪个具体文件中,只需在示例代码(部分)前面加上s.th。比如AbstractVehicleFactory.cpp:
。请编辑您的问题。哦,谢谢,但我必须将所有函数定义放在模板类的头文件中。有什么特别的原因吗?提前谢谢。