2010-08-31 1 views
2

Приветствия все,Проблема с библиотекой C++ MinGW (только для Windows, работает в Linux)?

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

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

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

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

  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» он выходит из строя с сообщением (это перевод с японского сообщение об ошибке)

"Приложение не может performe правильно (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.

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

ответ

2

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

#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 (только classess вы хотите «экспорт», использовать во внешнем коде)

class RINZO_LIB YourExportedClass 
{ 
... 
} 

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

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

Кроме того, все функции требуют RINZO_LIB макрокоманды, чтобы быть видимой за пределы библиотеки:

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

Большого спасибо Kamil.You спасло мой день !!!! –

+0

Qt предоставляет также набор макросов, который упрощает этот шаг. Вы можете найти рекомендации в главе [Создание общих библиотек] (http://doc.qt.io/qt-5/sharedlibrary.html) документации Qt. – SGaist