g ++给视觉工作室感到高兴的错误
我有一些在Visual Studio上运行良好的代码,现在我正试图在g ++上编译它。 它在一堆地方给我'对SomeClass :: someMethod()const'的未定义引用。
最常见的情况如下:
for (const SomeListNode *node = owner->some_list; node != 0; node = node->getNext())
在这种情况下,我得到'SomeListNode :: getNext()const'的未定义引用。 这个类的头文件是明确包含的。 为什么这在g ++中不合法?
编辑更多信息
我正在建造一个makefile文件,如下所示:
CC=g++
CFLAGS=-c -Wall -DDEBUG -g
LDFLAGS=
SOURCES=main.cpp SomeList.cpp SomeListNode.cpp Location.cpp OutputControl.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=theprogram
all: $(SOURCES) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o $@
.cpp.o:$(CC)$(CFLAGS)$ <-o $ @
最初列出的代码行位于OutputControl.cpp
。 它将一个指向SomeListNode
的指针并遍历它。 getNext
()返回一个指向另一个SomeListNode
的指针。
也可能会注意到这只发生在静态函数中。
你只能在const限定的对象上调用const限定的方法。 如果getNext()不是const,那么应该使用SomeListNode *node
而不是const SomeListNode *node
。
未定义的引用是链接器错误,并且这些与标题包含无关。 您必须确保您已将这些函数的定义编译到某个对象文件中,并将该对象文件传递给链接器。
请注意,如果您正在编译静态库,则链接器命令行中库的顺序会影响结果。 特别是,如果一个库依赖于其他库,则依赖应该出现在所有依赖库之前的命令行中。
无论如何,将每个目标文件分别编译为.o或库,然后使用nm提取在每个翻译单元中定义的符号列表,这些符号列表应该告诉您该定义是否已编译,并且将有助于如果您正在编译静态库,则确定顺序。
我建议你在你的makefile中设置依赖关系,这样依赖于别人的对象就会以正确的顺序生成。 还设置一个干净的目标,删除.o文件。 在这次运行之后,让它干净,然后制作。
这是我可以用你给我们提供的信息来想的最好的建议。
链接地址: http://www.djcxy.com/p/85445.html