1

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

リンカーがシンボルを認識しない理由はありますか? 図示されたコードが機能するように変更できる可能性はありますか?

4

0 に答える 0