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;
};

考虑上面的代码。我希望导出变量xml以便可以在 dll 边界上使用它。当链接到生成的导入库时,它会请求以下符号。

“公共:静态类分配器 * 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