2016-08-04 9 views
0

私はDLLに取り組んでいます。これは多くの時間が他.h/.cppから、私はそれが含まれ、私のIGlobal.hです:私は、DLLをコンパイルするときDLL全体のグローバルな構造体ですか?

#ifndef _IGLOBALS_ 
#define _IGLOBALS_ 

struct IGlobalBitmaps { 
    IBitmap mKnobGeneral; 
    IBitmap mButtonScore; 
    IBitmap mButtonRandom; 
    IBitmap mButtonLoad; 
    IBitmap mButtonClear; 
    IBitmap mButtonShape; 
    IBitmap mSwitchGeneral; 
}; 

IGlobalBitmaps gGlobalBitmaps; 

#endif // !_IGLOBALS_ 

、それはLNK1169一つ以上の多重定義されたシンボルはを発見したと言います。

どうすればよいですか?私はconst(一部のIBitmapメソッドはconstではないので)とstatic(そのDLL以降、それは後で苦痛になる)のどちらも使用できません。

+0

[/フォース(https://msdn.microsoft.com/en-us/library/xttf5w7w.aspx)または/ FORCE:MULTIPLE]オプションは、このエラーを上書きします。 – Skywrath

+1

ヘッダーからインスタンス化するべきではありません。それでも、DLLに格納された変数を使用する場合は、エクスポートされたシンボル名を持つように '__declspec(dllexport)'を宣言します。 –

答えて

2

.hファイルで変数をexternとして宣言し、それをcppファイルのいずれかに定義する必要があります。

0

DLLの外部から使用する変数を宣言するときは、インポート/エクスポートのステータスを与える必要があります。あなたはLoadLibrary (...)でDLLをロードする場合はボーナスポイント

#ifdef BUILDING_DLL 
// When building the DLL, export 
# define DECL_DLL __declspec (dllexport) 

#else 

// When building something that uses the DLL, import 
# define DECL_DLL __declspec (dllimport) 
#endif 

DECL_DLL IGlobalBitmaps gGlobalBitmaps; 

、むしろそのインポートライブラリにリンクするよりも、あなたはDLLがGetProcAddress (...)を使って、関数や変数をエクスポート得ることができます。

+0

"外部" DLLを使用する必要はありません:私はDLL内で使用するだけで、すべてのクラス/インスタンスからアクセスする必要があります。 – markzzz

+0

@paizza:まあ、それはDLLなので、それを 'static'宣言できなかったと言いました。そのようなことは別のことを示しています。 –

+0

はい、DLLです。私はDLLで静的を使用することが苦痛であることを知っているので、静的なことは避ける。だからこそ... – markzzz

関連する問題