Я использую файл определения модуля (.def) в Visual Studio 2008 для выборочного экспорта символов для создания библиотеки импорта. Согласно документация на MSDN, добавив ключевое слово ДАННЫЕ (или же КОНСТАНТА) после символа-имени позволяет создавать объявления данных. В связи с этим я сталкиваюсь с несколькими проблемами. Буду признателен, если кто-нибудь сможет пролить свет на проблему, изложенную ниже.
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. При связывании с результирующей библиотекой импорта она запрашивает следующий символ.
«public: статический класс Allocator * MemoryService :: xml» (? xml @ MemoryService @@ 2PAVAllocator @@ A)
Когда символ добавляется в файл определения модуля без ДАННЫЕ ключевое слово, он распознает символ, но код, использующий переменные, вылетает. Связывание с библиотекой импорта с символом, помеченным как ДАННЫЕ не распознает символ и вместо этого выдает ошибку компоновщика (неразрешенный символ).
EXPORTS
?xml@MemoryService@@2PAVAllocator@@A DATA
«свалка / экспорт» однако перечислите результаты, показанные ниже. Получающаяся библиотека импорта, очевидно, экспортирует имя, о котором идет речь.
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
Есть ли причина, по которой компоновщик не распознает символ? Возможны ли какие-либо модификации, которые позволили бы проиллюстрированному коду работать?
Задача ещё не решена.
Других решений пока нет …