2015-01-09 3 views
3

У меня есть класс, который получен из QObject и QRunnable, а также имеет макрос Q_OBJECT. Библиотека, которая содержит компиляции классов, отлично, и я получаю файлы .lib и .dll. Я использую MSVC 2013 и QT 5.4 (предварительно скомпилированные двоичные файлы из qt.io).Qt5 нерешенная внешняя функция staticMetaObject

Глядя на DLL, используя Walker Dependency, я вижу, что функция есть. Файл get moc'ed, что означает, что я могу посмотреть на полученный CPP-файл. В качестве доказательства здесь есть функция, которая вызывает проблемы.

const QMetaObject DHImageConvHandler::staticMetaObject = { 
    { &QObject::staticMetaObject, qt_meta_stringdata_DHImageConvHandler.data, 
     qt_meta_data_DHImageConvHandler, qt_static_metacall, Q_NULLPTR, Q_NULLPTR} 
}; 

Теперь, когда я пытаюсь создать приложение, которое ссылается на эту библиотеку, я получаю следующую ошибку.

unresolved external symbol "public: static struct QMetaObject const DHImageConvHandler::staticMetaObject" ([email protected]@@[email protected]@B) 
referenced in function "public: static class QString __cdecl DHImageConvHandler::tr(char const *,char const *,int)" ([email protected]@@[email protected]@[email protected]) 

Изменение типа проекта для библиотеки из «динамической библиотеки» на «Static Library» делает это уйти, но мне очень интересно, почему. Код находится в lib. Я открыл библиотеку импорта текстовым редактором и искал staticMetaObject, и, как уже упоминалось ранее, Dependency Walker также показывает, что он есть.

Может ли кто-нибудь пролить свет на это?

Редактировать 10.01.2015 Я с ошибкой о том, кто использует библиотеку в вопросе. Этот lib связан с другой библиотекой, которая является частью приложения.

+1

У вас есть правильно настроенные префиксы dllimport/dllexport? (Например, http://qt-project.org/faq/answer/when_creating_a_library_with_qt_windows_and_using_it_in_an_application_then). – Archie

+0

Как я не нашел эту ссылку? В любом случае, да, эти операторы импорта присутствуют в коде, но на всякий случай я дважды проверю. –

ответ

3

Спасибо, Арчи, указав меня в правильном направлении. Префиксы dllimport/dllexport являются частью кода - дождаться его - , но в каждой библиотеке используется одна и та же директива макроса и препроцессора. Это означает, что когда моя проблемная библиотека используется кодом другой библиотеки, и оба используют один и тот же макрос для экспорта своих символов, вторая библиотека включает в себя заголовки первой библиотеки с dllexport вместо dllimport. Как только я дал свою проблему lib, его собственный макрос dllexport/dllimport работал.

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