С C++ я пытаюсь использовать класс, указанный в моем экземпляре главной программы, который будет использоваться с DLL. Это много примеров для класса из DLL для использования в основной программе, но мне нужно другое. Пока простое объявление в порядке, но на следующем шаге будет использоваться статический класс из основной программы в DLL.Экспорт класса C++ из основной программы в DLL
Для знания, я использую MinGW 3.4.5 на Windows, 10.
Для примера я пытаюсь создать 3 файла:
- tst_class.lib
- tst_library.dll
- tst.exe
и файлы исходного кода являются:
- tst_class.h
class ON_MAIN tst_class {
public:
tst_class(char *);
~tst_class(void);
};
- tst_class.c
#include <stdio.h>
#define ON_MAIN __declspec(dllexport)
#define ON_DLL __declspec(dllimport)
#include "tst_class.h"
tst_class::tst_class(char *source)
{
printf("new tst_class() from %s\n", source);
}
tst_class::~tst_class(void)
{
printf("delete (tst_class *)\n");
}
- tst_library.c
#include <windows.h>
#define ON_MAIN __declspec(dllimport)
#define ON_DLL __declspec(dllexport)
#include "tst_class.h"
ON_DLL void tst(void)
{
tst_class *t = new tst_class("library");
delete t;
}
- tst.c
#include <stdio.h>
#include <windows.h>
#define ON_MAIN __declspec(dllexport)
#define ON_DLL __declspec(dllimport)
#include "tst_class.h"
typedef void (__cdecl *f_pointer)(void);
int main(int argc, char **argv)
{
tst_class *t = new tst_class("main");
delete t;
HMODULE module = LoadLibrary("tst_library.dll");
if(module != NULL) {
printf("Dll loaded\n");
void *function_pointer = (void *)GetProcAddress(module, "tst");
if(function_pointer != NULL) {
f_pointer function = (f_pointer)function_pointer;
function();
}
FreeLibrary(module);
} else {
printf("Can't load dll\n");
}
return 0;
}
Чтобы компилировать их:
g++ -c tst_class.c -o tst_class.o
OKar cr tst_class.lib tst_class.o
OKg++ tst_library.c tst_class.lib -o tst_library.dll -shared
Ошибка
И вот я получил сообщение об ошибке:
.../ccpg0mO9.o:. Tst_library.c :(текст + 0x5A): неопределенная ссылка на «_imp___ZN9tst_classC1EPc ' .../ccpg0mO9.o:. tst_library.c :(текст + 0xb4): неопределенная ссылка на '_imp___ZN9tst_classD1Ev'
Но после до последнего шага ...
g++ tst.c tst_class.lib -o tst.exe
OK
Что я делаю неправильно с компиляции/связывания библиотеки?
Исполняемый файл работает хорошо. Не загружать библиотеку cource, потому что она не существует.
Хорошо. Я получил это. Моя проблема с 'undefined reference' исчезла. Теперь я могу сделать больше тестов, но я понял: код класса находится в файле .lib. Я хочу, чтобы код класса находился в основной программе, а с новыми версиями DLL будет использовать новый источник. – Gangrel
Хорошо, я рад, что он работает. Это звучит как новый вопрос. Напишите его с образцами кода, ожидаемыми результатами и т. Д. И разместите его как новый вопрос. – Niall
Задаю еще один вопрос. Но решение предназначено только для 'undefined reference'. Главный вопрос: Использовать класс (код) из основной программы в DLL. – Gangrel