1

ここでコードを使用していますが、SDL関数を呼び出すすべての関数を、メインの.cppファイルではなく別のヘッダーファイルに配置する必要があります。そこで、Methods.hという新しいファイルを作成しました。ファイルは次のようになります。

main.cpp:

#include "Methods.h"
...

Methods.h:

#include "SDL/SDL.h"
#include "SDL/SDL_opengl.h"
....

そして、mainからすべての関数を削除し、Methods.hに配置しました。

プロジェクトをビルドしようとすると、「複数定義エラー」と表示されます。

/media/Data1/Projects/OpenGL/Game2/Methods.h|29|multiple definition of `event'|
obj/Debug/main.o:/media/Data1/Projects/OpenGL/Game2/Methods.h|29|first defined here|
obj/Debug/src/Machine.o||In function `drawFrame()':|
/media/Data1/Projects/OpenGL/Game2/Methods.h|29|multiple definition of `drawFrame()'|
obj/Debug/main.o:/media/Data1/Projects/OpenGL/Game2/Methods.h|29|first defined here|
obj/Debug/src/Machine.o||In function `init_GL()':|
/media/Data1/Projects/OpenGL/Game2/Methods.h|73|multiple definition of `init_GL()'|
obj/Debug/main.o:/media/Data1/Projects/OpenGL/Game2/Methods.h|73|first defined here|
obj/Debug/src/Machine.o||In function `init()':|
/media/Data1/Projects/OpenGL/Game2/Methods.h|97|multiple definition of `init()'|
obj/Debug/main.o:/media/Data1/Projects/OpenGL/Game2/Methods.h|97|first defined here|
obj/Debug/src/Machine.o||In function `clean_up()':|
/media/Data1/Projects/OpenGL/Game2/Methods.h|123|multiple definition of `clean_up()'|
obj/Debug/main.o:/media/Data1/Projects/OpenGL/Game2/Methods.h|123|first defined here|
4

2 に答える 2

3

ヘッダーファイルにいくつかの関数定義があるようです。これは、ヘッダーを含む各ソースファイルから各関数の個別の定義を取得することを意味します。inlineヘッダーを含むすべての翻訳単位で定義できるようにするには、宣言する必要があります。

// Methods.h
#ifndef METHODS_H
#define METHODS_H

inline void initGL() {
    // do stuff
}

#endif

または、ヘッダーでそれらを宣言し、定義をソースファイルに移動することもできます。

// Methods.h
#ifndef METHODS_H
#define METHODS_H

void initGL();

#endif

// Methods.cpp
#include "Methods.h"

void initGL() {
    // do stuff
}

グローバル変数もあります。それを維持したい場合は、定義をソースファイルに移動externし、ヘッダーファイルで宣言する必要があります。または、静的変数にアクセスする関数に置き換えることもできます。

inline SDL_Event & event() {
    static SDL_Event instance;
    return instance;
}

これには、関数が最初に呼び出されたときに初期化されるという長所と短所があります。

于 2012-06-25T12:06:34.523 に答える
3

file-new-file-sourceファイルなどを使用してコードブロックにファイルを追加すると、デバッグバージョンとリリースバージョンにファイルを含めるかどうかを尋ねる画面が表示されます。もちろん私がそれらを含めたいと思ってボックスにチェックを入れた場合、なぜ他にファイルを追加するのでしょうか?その後、codeblocksは自動的にファイルを含めます。次に、ファイルをコードに明示的に含めると、ファイルが自動的に実行していることを複製します。したがって、ファイルを追加するときは、結果が非​​常に混乱するため、これらのボックスにチェックマークを付けないでください。今日これを持っていた。

乾杯

podge

于 2014-05-21T20:36:55.903 に答える