我有一个Makefile,如下所示:
CFLAGS = -c -Wall -std=gnu++11
SOURCES =
OBJECTS = $(SOURCES:.cpp=.o)
all: main.o filelog.o temp.o measobj.o
g++ -pthread main.o measobj.o filelog.o temp.o -o run
.cpp.o:
g++ $(CFLAGS) $< -o $@
clean:
rm *.o
其中temp是measobj的子类。我的问题是我在尝试编译时遇到此错误:
g++ -pthread main.o measobj.o filelog.o temp.o -o run
measobj.o: In function `MeasObj::MeasObj()':
measobj.cpp:(.text+0x1c): undefined reference to `vtable for MeasObj'
temp.o: In function `.LC6':
temp.cpp:(.rodata+0x8c): undefined reference to `typeinfo for MeasObj'
collect2: error: ld returned 1 exit status
make: *** [all] Error 1
任何想法如何纠正?
答案 0 :(得分:1)
我不知道它是否会有所帮助,但你绝对应该(a)从CFLAGS变量中删除-c
标志并将其直接放入.cpp.o
规则,然后( b)将$(CFLAGS)
变量添加到您的链接行。在编译行和链接行上使用不同的编译器控制标志集几乎总是一个坏主意(显然你不想在编译行上放置仅链接器标志,反之亦然)。
另外,建立目标all
的规则run
是错误的。规则应该是虚假的(通常像all
这样的规则是假的)或者它们应该构建目标(确切地说)。使用此makefile,如果运行make
然后再次运行它而不更改任何内容,它仍将始终重新链接run
命令。
如果这些事情没有帮助,那么您的问题很可能出现在您的代码中,而不是在makefile中。
答案 1 :(得分:0)
我找到了解决方案,我忘了定义一个虚函数。我还必须在基类中定义虚函数,这对我来说仍然没有意义。但是,是的,无论如何都是为了你的帮助。