这对我来说是一个难题:
c++ undefined reference to destructor
这就是问题,代码与链接,完整的makefile和错误相同。链接的答案确实有帮助,但只是强调我在一个我没想到的地方有一些标题。
CXX = g++
BIN = .
LIBS = -L.
INCLUDE = -I . -I
CXXFLAGS = -pipe # -O6
LFLAGS = -lm
GeomTest_OBJS = geomTest.o SASAGeometry.o
geomTest_source = SASAGeometry.cpp SASAGeometry.h sasa_transformMatrix.cpp sasa_transformMatrix.h geomSetup.cpp
SASAGeometry.o : SASAGeometry.cpp SASAGeometry.h sasa_transformMatrix.cpp sasa_transformMatrix.h
geomTest.o : geomSetup.cpp
geomTest : $(GeomTest_OBJS) makefile
$(CXX) -o geomTest.o -o SASAGeometry.o $(LIBS) $(INCLUDE) $(CXXFLAGS) $(geomTest_source) $(LFLAGS)
$(CXX) $(LIBS) $(INCLUDE) $(CXXFLAGS) -o $(BIN)/geomTest geomTest.o SASAGeometry.o $(LFLAGS)
clean : \rm *.o *~ p1
我已声明并实例化析构函数而不是(允许编译器执行其操作)
geomSetup.cpp:(.text+0x5ab): undefined reference to `SASAGeometry::~SASAGeometry()'
geomSetup.cpp:(.text+0x5cd): undefined reference to `SASAGeometry::~SASAGeometry()'
没有其他错误。 (对不起,如果它更可能碰到看似排序的问题而不是链接到它们,但我的努力没有奏效)
提前致谢!
修改:
请务必编写正确的来源文件,而不是您忘记复制的内容。
嗨@trojanfoe和@Kerrick SB,两个答案让我看看我的makefile并意识到它很难看。这是修订版。我仍然得到相同的'对析构函数的未定义引用'错误:
CXX = g++
BIN = .
LIBS = -L.
INCLUDE = -I.
CXXFLAGS = -pipe # -O6
LDFLAGS = -lm
GeomTest_OBJS = sasa_transformMatrix.o SASAGeometry.o geomSetup.o
SASAGeometry.o : SASAGeometry.cpp SASAGeometry.h
sasa_transformMatrix.o : sasa_transformMatrix.cpp sasa_transformMatrix.h
geomSetup.o : geomSetup.cpp
geomTest : $(GeomTest_OBJS)
$(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $+
clean : \rm *.o *~ p1
geomSetup.o: In function `main':
geomSetup.cpp:(.text+0x5ab): undefined reference to `SASAGeometry::~SASAGeometry()'
geomSetup.cpp:(.text+0x5cd): undefined reference to `SASAGeometry::~SASAGeometry()'
collect2: ld returned 1 exit status
make: *** [geomTest] Error 1
为什么链接器会抱怨析构函数而不是类中的构造函数或任何其他方法/函数?
再次感谢!
答案 0 :(得分:2)
-o SASAGeometry.o
目标中的geomTest
看起来非常怀疑 - 您正在覆盖其中一个依赖项对象(实际上是两个依赖项)。
试试这个:
geomTest : $(GeomTest_OBJS)
$(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $(GemoTest_OBJS) $(LIBS)
(请注意$LDFLAGS
是保存链接器标志的常规变量,而不是$LFLAGS
工具使用的lex
。
答案 1 :(得分:2)
您的可执行输出文件和您的目标文件geomTest.o
具有相同的名称!当链接器覆盖目标文件时,这一定会让您遇到麻烦。
将其更改为$(CXX) -o geomTest ...
,或更好地更改为$(CXX) $@ ...
,以避免将来出现此类问题。
实际上,你完全滥用了链接器命令:你只想拥有一个单-o
选项,并直接列出对象,没有标志:
g++ -o myprog main.o foo.o bar.o
在Makefile中,帮自己一个忙,并使用魔术宏:
myprog: main.o foo.o bar.o
$(CXX) $(LDFLAGS) -o $@ $+ $(LIBRARIES)
此处-o $@
与目标名称匹配,即-o myprog
,$+
匹配所有相关名称,即main.o foo.o bar.o
。
使用变量背后的指导思想是,如果你可以帮助它,你不应该多次说同一件事。因此,您可以将myprog: $(MyObjects)
作为规则,但在命令行中使用$+
以避免重复MyObjects
。这改善了局部性和可维护性。