Проблема в том, что ваш заголовочный файл, предназначенный для компиляции в DLL, содержит код!Таким образом, «main.exe» представляет локальную копию встроенных функций (таких как Base :: sys), но фактическая реализация «Base :: setSystem» компилируется в DLL.Поэтому, когда main вызывает вызов "setSystem", он вызывает Base :: setSystem, связанный с DLL.Но когда он компилирует Base :: sys, он видит, что встроенная реализация существует, и использует это.
Другими словами, у вас есть две копии "Base", плавающие вокруг.Один, который живет в EXE и другой, который живет в DLL.А встроенные функции путают компилятор и компоновщик в отношении того, какую версию вызывать.
Не помещайте встроенные функции (или код в этом отношении) в заголовочный файл, где реализация должна жить в DLL.
Простое исправление:
// base.h (gets included by main)
class Base {
private:
static Filesystem * filesystem;
static Logger * logger;
static System * system;
public:
static void setFilesystem(Filesystem * filesystem_);
static void setApplication(Application * application_);
static void setLogger(Logger * logger_);
static void setSystem(System * system_);
static Filesystem * fs();
static Logger * log();
static System * sys();
};
// base.cpp (gets compiled only within the DLL
System* Base::sys()
{
return system;
}
// repeat "get" function for "log" and "fs" as well
Правильное исправление:
Вы действительно не должны пытаться экспортировать классы C ++ из DLL.Это разрешено, но очень быстро усложняется, когда вы начинаете встраивать код в заголовочные файлы и менять интерфейсы в разных версиях DLL.
Лучший подход - экспортировать чистую библиотеку "C" из DLL.И не выставляйте внутренности в заголовочные файлы.ИЛИ, если вы хотите экспортировать классы C ++, делайте это с интерфейсами COM.Затем все, что вы делаете, это помещаете объявление интерфейса в ваш заголовочный файл.