2012-04-13 70 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。這不會成爲你遇到的問題的原因,但這是習慣習慣的良方。