我在 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
链接器无法识别符号是否有原因?是否有任何可能的修改可以允许图示代码工作?