0

プロジェクトにサードパーティのコードを統合しようとして、障害にぶつかりました。ヘッダーのみの OpenGL テキスト レンダリング ソリューションである fontstash を統合しようとしています。( https://github.com/memononen/fontstash ) 全体として、SDL、GLEW、AssImp、Lua 5.3/LuaBridge、Bullet Physics も使用しています。fontstash ヘッダー ファイルを vc/include ディレクトリに配置しました。コンパイルは正常に進行しますが、リンクは巨大な壁の中で惨めに失敗します...

c_main.obj : error LNK2005: "unsigned int __cdecl glfonsRGBA(unsigned char,unsigned char,unsigned char,unsigned char)" (?glfonsRGBA@@YAIEEEE@Z) already defined...
c_main.obj : error LNK2005: "void __cdecl glfonsDelete(struct FONScontext *)" (?glfonsDelete@@YAXPAUFONScontext@@@Z) already defined in...
...
c_main.obj : error LNK2005: _stbtt_FindMatchingFont already defined in...
c_main.obj : error LNK2005: _stbtt_GetFontNameString already defined...

fontstash ヘッダー ファイルを介して提供される関数のリスト全体を単純に反復しているように見えます。ヘッダーを extern "C" {} でラップしようとしましたが、役に立ちませんでした。プロジェクトディレクトリのファイルも含めてみました。なぜこれが起こっているのか、何が原因なのかをどこから始めればよいのか、私は途方に暮れています。トピックのタイトルに示されているように、私は MSVC12/Win7 を使用しており、Windows 用にビルドし、x86 用にコンパイルしています。

さらに、fontstash を使用する関連コードが他の場所で使用されているため、ファイルを複数回含めています。これが問題であると考えましたが、fontstash から提供されたヘッダー ファイルにはインクルージョン ガードがあるため、その点でなぜこれが発生するのかわかりません。

4

1 に答える 1

2

これは、実装を含むヘッダー ファイルでよくある問題です。#includeディレクティブを使用すると、コンパイラは単に.hファイルの内容を代わりに挿入します。したがって、プロジェクトのさまざまな場所でこのヘッダーを使用すると、メソッドとグローバル変数の同一の実装がいくつか得られます。#ifdefまたはコンパイラガードが#pragma onceあるため、問題なくコンパイルされます。しかし、リンカーがすべてのコンパイル済みobjファイルを 1 つの実行可能モジュールに結合しようとすると、いくつかの同一の実装が取得されます。どちらを使用すべきかを認識できなかったため、LNK2005エラーが発生します。この問題を解決するには、実装とグローバルを別のcppファイルに移動して、プロジェクトに含めることができます。他の方法は、すべてのヘッダー関数を としてマークするinlineか、使用することです__declspec(selectany)

于 2016-03-18T05:45:35.107 に答える