1

すべてのopengl関数のラッパー関数を含むライブラリopengl.libがあります。関数は独自の名前空間で宣言されているため、ラッパー関数は opengl 関数と同じ名前で名前を付けることができます。したがって、ラッパー関数内では、opengl 関数は ::gl***(); で呼び出されます。

opengl.h:
namespace OpenGL {
    void glFunction();
}

opengl.cpp:
void OpenGL::glFunction() {
    ::glFunction();
}

ここでの問題は、アプリケーションでこの opengl.lib を使用し、独自の「opengl.h」を含めると、何らかの理由で、ラッパー関数ではなく、実際の opengl 関数が直接呼び出されることです。

実際のopengl.hを含めていないことを確認したので、これは何らかのリンカの問題であるに違いありません。どうすれば解決できますか?ライブラリパスに実際のopenglライブラリもあります。そうしないと、実際のopengl関数を使用するため、opengl.libでリンカーエラーが発生するためです。したがって、実際のopenglライブラリと私のopengl.libが何らかの形で混在し、リンカーは私の代わりに実際のopengl.libを使用することにしました。

ラッパー関数の名前を別の名前に変更することでこれを解決できることはわかっていますが、同じ名前を使用したいと考えています。

この質問は、以前の質問C++ wrapper with same name?に関連しています。

最適化を無効にして Visual C++ を使用しています。

4

5 に答える 5

2

ラッパーは、インライン化されるほど十分に薄いですか?

于 2009-02-19T21:09:55.557 に答える
0

実際の opengl.h の名前は、ラッパー ヘッダー ファイルと同じですか? そうである場合、コンパイラはユーザー定義パスの前にシステム パスを検索するため、気付かないうちにインクルードしている可能性があります。

于 2009-02-19T21:23:55.090 に答える
0

前処理された cpp ファイルを見ると、この種の問題を解決するのに非常に役立ちます。

ビジュアル C++ では、opengl.h を含むファイルのプロパティに移動し、プリプロセッサで [Generate Proprocessed File] オプション (/P) を有効にします。

これにより、.i ファイルが生成されます。

于 2009-02-19T22:19:58.860 に答える
0

問題はあなたが投稿したものによる定義ではなく、問題はあなたの呼び出しにあります。関数の呼び出し方法に関連するコードを投稿できますか?

OpenGL::glFunction();私がそれを行う方法であり、それはうまくいくでしょう。

于 2011-07-10T22:19:38.137 に答える
0

opengl.lib をビルドするときは、実際の opengl ライブラリにリンクする必要があるだけです。独自のライブラリを使用しているプロジェクトで、実際の opengl ライブラリへの参照がないことを確認してください。実際のライブラリへの参照がない場合、実際の関数を呼び出す方法はありません。それが完了したら、正しい名前空間を使用していることを確認してください。

// Call OpenGL::glFunction();
using namespace OpenGL;
glFunction();
于 2009-05-18T22:05:57.370 に答える