Методы DLL не экспортируются, когда они определены в исходном файле (VC ++) - PullRequest
0 голосов
/ 23 декабря 2011

У меня есть основная программа, связывающая с DLL в VC ++.Получается, что если я объявляю методы класса вне DLL-файла заголовка, все компилируется и связывается нормально, но Main не может получить к ним доступ.

//mydll.h 
#if XXX_EXPORTS
#define CLASS_DECLSPEC __declspec(dllexport)
#else
#define CLASS_DECLSPEC __declspec(dllimport)
#endif


class CLASS_DECLSPEC COrbitPropagator
{
public:
  int test(double initime, std::vector<double> inivector);  
}

Если я определяю метод test в заголовочном файле (встроенном или ниже этого объявления) работает Main.Однако, если я определяю этот метод в исходном файле .cpp, при вызове этого метода происходит сбой Main, и он печатает это сообщение:

HEAP [Main.exe]: неверный адрес, указанный для RtlFreeHeap (003A0000,003C2CE8)

Обе среды выполнения (dll и main) настроены на отладку многопоточных DLL, но я пробовал другие комбинации.Есть ли решение?Я хотел бы избежать написания всего моего кода DLL в заголовочном файле!

EDITED: This only happens when the method uses the stl (e.g. std::vector, std::string)

1 Ответ

3 голосов
/ 23 декабря 2011

Когда вы пишете код в заголовке, он работает, потому что вызов встроен, и поэтому он никогда не идет в DLL для его поиска.

Вы можете проверить, импортируется / экспортируется ли тестовая функция, с помощью необходимой утилиты: Зависимость Уокер .

В любом случае, вы передаете std::vector с копией в DLL. Таким образом, необходимо, чтобы DLL и EXE компилировались и связывались с использованием точно одинаковых заголовков C ++, библиотек, версии компилятора и параметров компилятора.

Если вы не будете следовать этому правилу, например, DLL отлажена, а EXE выпущен, тогда вы получите очень странные эффекты: случайные повреждения, сбои и т. Д.

Если вам нужно смешивать библиотеки DLL и EXE, скомпилированные по-разному, то интерфейс должен быть строго ограничен (обычный C без кросс-динамической памяти).

...