2012-04-13 30 views
1

OpenGLを使用してC/C++でグラフィックスプログラムを作成しています。私はたくさんの.cファイルを持っていますが、私はassign1gui.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です。私はまた、2つのヘッダーファイル - 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()を呼び出す方法の例。代入1gui.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関数を呼び出していますか、その逆ですか?あなたが得たエラーは何ですか? –

+4

なぜ問題があるとお考えですか?問題はどこだ?取得している特定のエラーメッセージはありますか? –

+1

あなたのコードでフォルダに移動し、 'make'を実行してください(ちょうどその単語を1つ入力してからEnterを押します)。コードをコンパイルする必要があります。その後、どのようなエラーメッセージが表示されるかをお知らせください(関連するC++またはCファイルが含まれています)。 –

答えて

2

.ccまたは.cファイルのみのため、main.cppはこのメイクファイルではわかりません。私はmain.oがビルドされていないと思われます。あるいは、おそらくあなたがコンパイルに失敗したため、main.cまたはmain.ccというファイルがありますが、それはdrawPolygonLine()それに定義されています。既存のmain.cmain.ccファイルを削除するか、名前を変更

  1. :この問題を解決するには

    。あなたのプログラムは、C++プログラムの場合は

  2. プログラムが実際にCプログラムであれば、main.c

  3. にファイル名を変更することは、あなたは.ccに拡張子を変更してみてください可能性がありますが、私はあなたが実行されます疑いますg++ではなくgccを使用しているため、問題が発生します。Cコードの多くは、有効なC++コードではあるが、多くの微妙な違いがあることに注意してください

    CXX = g++ 
    

CXX = gcc 

を - と:この場合、私はまた、変更したいですベストプラクティスは各言語で非常に異なります。このため、は、CとC++を異なる言語として扱うのが最善です。


、これはそれを修正しない場合:あなたのヘッダファイルで宣言さdrawPolygonLine()の関数シグネチャは、それはあなたのメインのファイルで定義されています方法と同じであることを

  • チェックを。これらの宣言が呼び出された方法と一致することを確認してください。
  • drawPolygonLine()を呼び出すファイルが#include "assignment1gui.h"drawPolygonLine()staticとして宣言されていないことを確認し
  • トップ
  • にしていることを確認してください(静的関数は、その翻訳単位の外に表示されていない - ので、2つのコンパイル時にリンカがそれらを見ることはありません一緒に出力ファイル)も

、それが中で定義されていたソースファイルに対応するヘッダファイル内の関数宣言を持つことをお勧めです - ので、あなたがassignment.cからmain.cで関数を呼び出したい場合、あなたは通常入れてしまうでしょう宣言はmain.hに、#includeには上のassignment.c。これはあなたが抱えている問題の原因ではありませんが、慣れるのは良い習慣です。

関連する問題