Как экспортировать глобальные переменные / массивы из DLL, созданной с помощью компилятора VS, на клиент, построенный с помощью компилятора MingW?

Общая информация [необязательно]:
Я недавно ознакомился со статическим & динамические библиотеки.
Сейчас я пытаюсь научиться использовать библиотеки DLL, я стараюсь имитировать все возможные варианты использования, чтобы столкнуться с возможными узкими местами и методами их предотвращения.

Моя цель:
Это выяснить Как экспортировать глобальную переменную из DLL, которая была скомпилирована с одним компилятором для ex. Компилятор VS (IDE Visual studio 2010) для клиента, который был скомпилирован с использованием другого компилятора MingW (IDE Qt Creator 5.0). На самом деле меня интересует конкретный случай, а не общий, но если будет предоставлена ​​информация для общего случая — это будет здорово.
Также важно что подключение dll к клиенту неявное(не expilcit, тогда мы вручную подключаем библиотеку).
Также я задал такой вопрос, потому что он мне интересен как поддержать клиентское приложение, предоставив обновленную DLL, Поскольку версия компилятора, используемая для client и dll в начале проекта, может быть одинаковой, но с течением времени они могут различаться, так как решить эту проблему двоичной совместимости?
Я застрял, пытаясь экспортировать массив, определенный в DLL для клиента.
DLL & клиент

        /* header file. Is used by both: dll and client */
#ifdef EXPORT
#define MYLIB __declspec(dllexport)
#else
#define MYLIB __declspec(dllimport)
#endifextern "C" { // My be this directive not supported by MingW???

#ifdef VS2010
extern MYLIB char ImplicitDLLName[];
#else
Q_DECL_IMPORT extern char ImplicitDLLName[];
#endif
}

DLL

/* .cpp file in dll: */
#define EXPORT ""#define VS2010 ""char ImplicitDLLName[] = "MySUMoperator";

клиент
/ * Клиент .cpp * /

void MainWindow::on_pushButtonAdd_clicked()
{
// ...
printf("%s",ImplicitDLLName);

}

Попытка использовать массив в клиенте приводит к следующей ошибке, сгенерированной компоновщиком:

 error: undefined reference to `_imp__ImplicitDLLName'

Мне известны проблемы искажения имен и совместимости, которые могут возникнуть из-за этого, но я пытаюсь решить их, отключив их с помощью

extern "C"{}

По ошибке возвращается от клиентаs linker I can tell that I have failed to disable it, because it reports that reference on _imp__ImplicitDLLName wasnt, поэтому я предполагаю, что это ImplicitDLLName только украшен дополнительными символами (искажение имени).
Интересно, может эта проблема возникла из-за различной реализации массивов в разных компиляторах или выравнивания массивов в памяти ??
Вопрос: как решить эту проблему двоичной совместимости ??

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector