2015-11-05 2 views
0

С 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.oOK
  • ar cr tst_class.lib tst_class.oOK
  • g++ 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.exeOK

Что я делаю неправильно с компиляции/связывания библиотеки?

Исполняемый файл работает хорошо. Не загружать библиотеку cource, потому что она не существует.

ответ

0

Ваши определения не совсем правильные. Форма declspec обычно

#if BUILDING_MYDLL 
    #define MYDLL_EXPORT __declspec(dllexport) 
#else 
    #define MYDLL_EXPORT __declspec(dllimport) 
#endif 

А для определения класса

class MYDLL_EXPORT tst_class { 
public: 
    tst_class(char *); 
    ~tst_class(void); 
}; 

Затем при создании и компоновки кода DLL, можно использовать командную строку определить для BUILDING_MYDLL (например -D BUILDING_MYDLL) или вы определяете BUILDING_MYDLL в файле заголовка, который является внутренним для dll (например, в решениях на основе Visual Studio, которые часто были stdafx.h).

Адрес another answer that is related.

+0

Хорошо. Я получил это. Моя проблема с 'undefined reference' исчезла. Теперь я могу сделать больше тестов, но я понял: код класса находится в файле .lib. Я хочу, чтобы код класса находился в основной программе, а с новыми версиями DLL будет использовать новый источник. – Gangrel

+0

Хорошо, я рад, что он работает. Это звучит как новый вопрос. Напишите его с образцами кода, ожидаемыми результатами и т. Д. И разместите его как новый вопрос. – Niall

+0

Задаю еще один вопрос. Но решение предназначено только для 'undefined reference'. Главный вопрос: Использовать класс (код) из основной программы в DLL. – Gangrel

Смежные вопросы