C ++ MinGW проблема с общими библиотеками (только для Windows, работает на Linux)? - PullRequest
2 голосов
/ 31 августа 2010

Приветствую всех,

Я использую MinGW, QT и CMake для своего проекта.

http://i34.tinypic.com/30w85xt.png

Как показано на рисунке, мой проект состоит из двух модулей.

  1. libRinzoCore.DLL - общая библиотека, которая определяет некоторые абстрактные классы и интерфейсы, а также некоторые основные функции приложения. Этот модуль используется для реализации динамических плагинов (которые также являются общими библиотеками, которые автоматическизагружается приложением).

  2. Rinzo.exe - основное приложение. Используются классы "libRinzoCore".

"libRinzoCore" в основном разработаниспользование объектов QT и связывание с библиотекой QT.

"Rinzo.exe" также использует объекты библиотеки QT, некоторые не используются в "libRinzoCore". Так что мне нужно связать библиотеку QT и "libRinzoCore" с этимисполняемый файл.

Я могу без проблем скомпилировать "libRinzoCore", и он сгенерировал два файла "libRinzoCore.DLL" и "libRinzoCore.DLL.a"

Но при компиляции "Rinzo.exe" это даетнародиз-за вывода:

Linking CXX executable Rinzo.exe
Info: resolving IRzPlugin::staticMetaObject       by linking to __imp___ZN9IRzPlugin16staticMetaObjectE (auto-import)
Info: resolving IRzViewerPlugin::staticMetaObject        by linking to __imp___ZN15IRzViewerPlugin16staticMetaObjectE (auto-import)
Info: resolving IRzLayeringPlugin::staticMetaObject        by linking to __imp___ZN17IRzLayeringPlugin16staticMetaObjectE (auto-import)
C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\mingw32\bin\ld.exe: warning: auto-importing has been activated without --enable-auto-import specified on the command line.
This should work unless it involves constant data structures referencing symbols
 from auto-imported DLLs.
[100%] Built target Rinzo

И при выполнении "Rinzo.exe" он вылетает с сообщением (это перевод с японского сообщения об ошибке)

"Приложение не может работать правильно (0xc0000005).Нажмите [OK] для отмены "

Вот мои файлы CMake для

libRinzoCore:

http://www.keepandshare.com/doc/2199086/rinzocore-txt-august-31-2010-12-10-pm-2k?da=y

Rinzo.exe:

http://www.keepandshare.com/doc/2199085/rinzo-txt-august-31-2010-12-10-pm-5k?da=y

Работает нормально, если я скомпилирую "libRinzoCore" как статическую библиотеку. И отлично работает в Linux.

Любые советы?

1 Ответ

2 голосов
/ 31 августа 2010

В Windows вам нужно объявить «экспортную» часть динамической библиотеки, чтобы она работала.

#ifdef Q_WS_WIN
#ifdef RINZO_EXPORT
#define RINZO_LIB __declspec(dllexport)
#else
#define RINZO_LIB __declspec(dllimport)
#endif
#else
#define RINZO_LIB
#endif

Затем вам нужно поместить RINZO_LIB перед объявлением класса внутри lib (только класс, который вы хотите "экспортировать", использовать во внешнем коде)

class RINZO_LIB YourExportedClass
{
...
}

Последняя часть - добавить макрос препроцессора при компиляции вашей библиотеки. Как вы можете видеть это RINZO_EXPORT

Помните, не добавляйте этот макрос препроцессора при "импорте" (используя код вне библиотеки).

Также для всех функций требуется, чтобы макрос RINZO_LIB был виден вне библиотеки:

RINZO_LIB void yourExportedFunction()
{
...
}
...