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

上一篇: g++ giving errors where visual studio was happy

下一篇: API documentation for the yaml