1

我正在使用 OpenGL 用 C/C++ 编写图形程序。我有一堆 .c 文件,现在,我正在尝试从 assignment1gui.c 中的 main.cpp 调用一个函数。老师给了我一个包含编译代码的文件。它看起来像这样:

OBJS   = assignment1gui.o shadertools.o main.o
TARGET = ass1

CXX = gcc

DBFLAGS  = -O0 -g3 -ggdb3 -fno-inline

WFLAGS   = -Wall -ansi
GLFLAGS  = `pkg-config --cflags gtk+-2.0`
LGLFLAGS = `pkg-config --libs gtk+-2.0` -lGL -lGLEW -lGLU -lglut

CXXFLAGS = $(WFLAGS) $(DFLAGS) $(GLFLAGS)
LDFLAGS  =  -export-dynamic -lXext -lX11 $(LGLFLAGS)


all: $(TARGET)
clean:
    rm -f $(OBJS) $(TARGET)

.SUFFIXES: .cc
.cc.o:
    $(CXX) -c $(CXXFLAGS) $<
.c.o:
    $(CXX) -c $(CXXFLAGS) $<
$(TARGET): $(OBJS)
    $(CXX) -o $(TARGET) $(OBJS) $(LDFLAGS) 

我试图调用的函数是“drawPloygonLine()”。我已经在“assignment1gui.h”中声明了这一点,正如我之前提到的,定义在 main.cpp 中。

从互联网上的所有帮助中,我意识到编译代码一定有问题。但我不确定。有人可以帮我吗?

抱歉,我之前遗漏了这部分。我得到的错误是:

assignment1gui.o: In function `on_btn_color_color_set':
assignment1gui.c:(.text+0x1c): undefined reference to `drawPolygonLine'
assignment1gui.o: In function `on_rb_tool_line_toggled':
assignment1gui.c:(.text+0x8b): undefined reference to `drawPolygonLine'
assignment1gui.o: In function `on_rb_tool_circle_toggled':
assignment1gui.c:(.text+0xfc): undefined reference to `drawPolygonLine'
assignment1gui.o: In function `on_rb_tool_rect_toggled':
assignment1gui.c:(.text+0x16d): undefined reference to `drawPolygonLine'
assignment1gui.o: In function `on_rb_tool_edit_toggled':
assignment1gui.c:(.text+0x24a): undefined reference to `drawPolygonLine'
collect2: ld returned 1 exit status
make: *** [ass1] Error 1

我在文件夹中的 C/C++ 文件是 main.cpp、assignment1gui.c 和 shadertools.c。我还有两个头文件——assignment1gui.h 和 shadertools.h。如前所述,我使用 assignment1gui.h 文件来声明新函数“drawPolygonLine();”

补充:“drawPolygonLine();”的声明 现在在“main.h”中,它看起来像这样:

#ifndef MAIN_H
#define MAIN_H

extern void drawPolygonLine();

#endif  /* MAIN_H */

main.cpp 和 assignment1gui.c 的开头都有"#include "main.h""。drawPolygonLine() 的定义是:

void drawPolygonLine()
{
    if(option[opCount-1]==4 && drawn==false)
    {           
        vCount++;
        vertex[vCount].x=A;
        vertex[vCount].y=B;
        lines=lines+2;
        vCount++;
        vertex[vCount].x=polyX;
        vertex[vCount].y=polyY;   
        clicks=0;     
        drawn=true;
    }

}

函数中使用的所有变量在 main.cpp 中都是全局的。

我如何调用 drawPolygonLine() 的示例;在 assignment1gui.c 中是在这个函数中:

void on_btn_color_color_set(GtkColorButton *colorbutton, gpointer user_data)
{
    drawPolygonLine();

    GdkColor color;
    gtk_color_button_get_color(colorbutton, &color);
    printf("Color set rgb=(%i,%i,%i)\n",color.red,color.green,color.blue);
}

我希望这可以说清楚。

4

1 回答 1

2

问题是main.cpp这个 make 文件不理解,因为它只有or文件的规则。我怀疑 main.o 没有被构建 - 或者,更有可能的是,因为你正在编译失败,所以有另一个文件被称为或包含在你的程序中,但没有在其中定义. .cc.cmain.cmain.ccdrawPolygonLine()

要解决这个问题:

  1. 删除或重命名任何现有文件main.cmain.cc文件。

  2. 如果您的程序实际上是 C 程序,则将文件名更改为main.c

  3. 如果您的程序是 C++ 程序,您可以尝试将扩展名更改为.cc,但我怀疑您会遇到问题,因为您使用的是gcc而不是g++. 在这种情况下,我也会改变:

    CXX = gcc
    

    CXX = g++
    

请记住,尽管许多 C 代码也是有效的 C++ 代码,但存在许多细微差别——每种语言的最佳实践也大不相同。因此,最好将 C 和 C++ 视为不同的语言。


如果这不能解决它:

  • 检查drawPolygonLine()头文件中声明的函数签名是否与主文件中定义的方式相同。检查这些声明是否与您调用它的方式相匹配。
  • 检查调用的文件drawPolygonLine()是否#include "assignment1gui.h"位于顶部
  • 检查drawPolygonLine()未声明为static(静态函数在其翻译单元之外不可见 - 因此在一起编译两个输出文件时链接器不会看到它们)

此外,最好在头文件中将函数声明与定义它的源文件相对应 - 因此,如果要在main.cfrom中调用函数assignment.c,通常会将声明放在main.h, 并将#include其放在assignment.c. 这不会是您遇到问题的原因,但习惯是一种很好的做法。

于 2012-04-13T11:20:47.247 回答