我正在使用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);
}
我希望这说清楚。
答案 0 :(得分:2)
问题是此make文件无法理解main.cpp
,因为.cc
或.c
文件只有has rules。我怀疑main.o没有被构建 - 或者更可能的是,因为你得到了一个失败的编译,还有另一个名为main.c
或main.cc
的文件包含在你的文件中程序,但没有定义drawPolygonLine()
。
解决这个问题:
删除或重命名任何现有的main.c
或main.cc
个文件。
如果您的程序实际上是C程序,请将文件名更改为main.c
如果您的程序是C ++程序,您可以尝试将扩展名更改为.cc
,但我怀疑您会因为使用gcc
而不是问题而遇到问题g++
。在这种情况下,我也会改变:
CXX = gcc
到
CXX = g++
请记住,虽然很多C代码也是有效的C ++代码,但是存在许多细微差别 - 并且每种语言的最佳实践都有很大不同。出于这个原因,最好将C和C ++视为不同的语言。
如果这不能解决问题:
drawPolygonLine()
的函数签名是否与主文件中定义的函数签名相同。检查这些声明是否与您调用它的方式相匹配。drawPolygonLine()
的文件是否位于顶部的#include "assignment1gui.h"
drawPolygonLine()
是否未声明为static
(静态函数在其翻译单元外部不可见 - 因此链接器在编译两个输出文件时不会看到它们)此外,最好在头文件中使用与其定义的源文件相对应的函数声明 - 因此,如果要从main.c
调用assignment.c
中的函数,通常会将声明放在main.h
中,将#include
声明放在assignment.c
的顶部。这不是你所遇到的问题的原因,但是习惯这是好习惯。