Visual Studio 2008 でモジュール定義ファイル (.def) を使用して、シンボルを選択的にエクスポートし、インポート ライブラリを生成しています。MSDNのドキュメントによると、シンボル名の後にキーワードDATA (またはCONSTANT ) を追加すると、データ宣言を作成できます。これに関して、私はいくつかの問題に直面しています。以下に概説する問題に誰かが光を当てることができれば幸いです。
class Allocator
{
public:
static const int size_not_tracked = 0xFFFFFFFF;
virtual void *allocate(size_t size, size_t align) = 0;
virtual void *reallocate(void* ptr, size_t size, size_t align) = 0;
virtual void deallocate(void *p) = 0;
virtual size_t allocated_size(void *p) = 0;
virtual size_t allocated() = 0;
};
class MemoryService
{
public:
static Allocator* GetProcessDefault();
static Allocator* GetProcessHeap();
static Allocator* GetNamedHeap(const char* name, bool tracked, bool logged);
static Allocator* xml;
};
上記のコードを検討してください。dll の境界を越えて使用できるように、変数xmlをエクスポートしたいと考えています。結果のインポート ライブラリに対してリンクする場合、次のシンボルが要求されます。
「public: static class Allocator * MemoryService::xml」 (?xml@MemoryService@@2PAVAllocator@@A)
DATAキーワードを指定せずにシンボルをモジュール定義ファイルに追加すると、シンボルは認識されますが、変数を使用するコードはクラッシュします。シンボルがDATAとして注釈されているインポート ライブラリに対してリンクすると、シンボルが認識されず、代わりに (未解決のシンボル) リンカー エラーが発生します。
EXPORTS
?xml@MemoryService@@2PAVAllocator@@A DATA
ただし、 「dumpbin /exports」は、以下に示す出力を一覧表示します。結果として得られるインポート ライブラリは、明らかに問題の名前をエクスポートします。
Microsoft (R) COFF/PE Dumper Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file xxxxx.lib
File Type: LIBRARY
Exports
ordinal name
....
?xml@MemoryService@@2PAVAllocator@@A (public: static class Allocator * MemoryService::xml)
....
Summary
CF .debug$S
14 .idata$2
14 .idata$3
4 .idata$4
4 .idata$5
10 .idata$6
リンカーがシンボルを認識しない理由はありますか? 図示されたコードが機能するように変更できる可能性はありますか?