2012-04-13 71 views
1

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

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。正如我前面提到的,我使用assign1gui.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

你是通过cpp文件调用c函数吗?反之亦然?你得到的错误是什么? – 2012-04-13 03:46:37

+4

你为什么说有问题?哪里有问题?是否有您收到的特定错误信息? – 2012-04-13 04:02:49

+1

用你的代码进入文件夹,并运行'make'(只要输入一个单词,然后按回车)。它应该编译你的代码。让我们知道你之后得到了什么错误消息(并且包括任何相关的C++或C文件)。 – 2012-04-13 04:14:21

回答

2

问题是main.cpp不能被这个make文件理解,因为它只有has rules对于.cc.c文件。我怀疑main.o没有被编译 - 或者更有可能的是,由于你的编译失败,还有另一个文件main.cmain.cc,它被包含在你的程序中,但没有drawPolygonLine()在其中定义。

要解决这个问题:

  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(静态函数是不是他们的翻译单元外部可见 - 因此链接不会看到他们编制二:当输出文件一起)

此外,这是很好的做法,在对应于它在定义的源文件中的头文件中的函数声明 - 所以,如果你想从assignment.c调用main.c一个功能,你通常会放在main.h#include声明它在顶部assignment.c。这不会成为你遇到的问题的原因,但这是习惯习惯的良方。