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の2つのヘッダーファイルがあります。前述したように、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 ファイルが理解できないことです。これは、またはファイルのルールしかないためです。main.o がビルドされていない可能性が高いと思われます。または、コンパイルに失敗しているため、orという別のファイルがプログラムに含まれていますが、定義されていない可能性があります。 . .cc.cmain.cmain.ccdrawPolygonLine()

これを解決するには:

  1. main.c既存のまたはmain.ccファイルを削除するか、名前を変更します。

  2. プログラムが実際に C プログラムである場合は、ファイル名を次のように変更します。main.c

  3. プログラムが C++ プログラムの場合、拡張子を に変更してみて.ccください。この場合、次のようにも変更します。gccg++

    CXX = gcc
    

    CXX = g++
    

多くの C コードは有効な C++ コードでもありますが、多くの微妙な違いがあり、ベスト プラクティスは言語ごとに大きく異なることに注意してください。このため、C と C++ は別の言語として扱うのが最善です。


これで問題が解決しない場合:

  • ヘッダー ファイルで宣言されている の関数シグネチャがdrawPolygonLine()、メイン ファイルで定義されている方法と同じであることを確認してください。これらの宣言が、呼び出した方法と一致することを確認してください。
  • 呼び出すファイルが一番上にあることを確認しdrawPolygonLine()#include "assignment1gui.h"ください
  • drawPolygonLine()として宣言されていないことを確認してくださいstatic(静的関数は翻訳単位の外では見えないため、2 つの出力ファイルを一緒にコンパイルするときにリンカーはそれらを認識しません)

また、関数が定義されているソース ファイルに対応するヘッダー ファイルに関数宣言を含めることをおmain.c勧めしassignment.cます。これは問題の原因ではありませんが、慣れるには良い方法です。main.h#includeassignment.c

于 2012-04-13T11:20:47.247 に答える