Ошибки ссылки библиотеки Qt в Windows - PullRequest
0 голосов
/ 27 апреля 2018

Проект прекрасно работает на Linux, но имеет проблемы с линковкой в ​​Windows.

1-й выпуск:

LNK2019: unresolved external symbol ...
LNK1120: 21 unresolved externals

.pro файл содержит:

isEmpty(IDE_BUILD_TREE): IDE_BUILD_TREE = ../../qt-creator-debug
LIBS += -L$${IDE_BUILD_TREE}/lib/qtcreator/plugins -lMyLibrary

Примечание. MyLibrary развернуто до $${IDE_BUILD_TREE}/lib/qtcreator/plugins до сборки. Сборка с Qt 5.10.1 и MSVC 2015.

В чем здесь проблема / хитрость? Как решить?


2-й выпуск:

В библиотеке .pro определена переменная файла VERSION, и результирующая библиотека имеет имя MyLibrary1.lib. После этого я получаю ошибку:

:-1: error: LNK1181: cannot open input file 'MyLibrary.lib'

Какой лучший способ решить проблему здесь: удалить VERSION или исправить .pro файл? Как?


3-й выпуск:

Другая ошибка ссылки:

mydialog.obj:-1: error: LNK2001: unresolved external symbol 
"struct QMetaObject const MyLibrary::staticMetaObject" 
(?staticMetaObject@MyLibrary@@3UQMetaObject@@B)

Ошибка возникает из-за следующей строки в коде (исчезает при закомментировании):

mydialog.cpp:

    QMetaEnum myEnum = QMetaEnum::fromType<MyLibrary::MyEnumClass>();

mylibrary.h:

namespace MyLibrary {

Q_NAMESPACE

enum class MYLIBRARYSHARED_EXPORT MyEnumClass {
...
};

Q_ENUM_NS(MyEnumClass)
...
} // namespace MyLibrary

А как решить 3-й?

1 Ответ

0 голосов
/ 27 апреля 2018

Исправлена ​​1-я проблема:

Мое плохое: ошибка, вызванная пропущенным MYLIBRARYSHARED_EXPORT в объявлениях некоторых классов, которые определены в глобальном заголовке как:

#if defined(MYLIBRARY_LIBRARY)
#  define MYLIBRARYSHARED_EXPORT Q_DECL_EXPORT
#else
#  define MYLIBRARYSHARED_EXPORT Q_DECL_IMPORT
#endif

Без MYLIBRARYSHARED_EXPORT прекрасно работает в Linux и Mac, но не работает в Windows.


Исправление 2-й проблемы:

Возможное решение - добавить в .pro строку файла:

win32:CONFIG += skip_target_version_ext

или

win32:TARGET_EXT = .dll 

для установки выходного имени файла без основного номера версии в Windows. Однако я вижу, например, что плагины Qt Creator связывают библиотеки с основным номером версии без проблем. Как это сделать?


3-е исправление проблемы:

Необходимо добавить Q_NAMESPACE декларацию также с MYLIBRARYSHARED_EXPORT:

namespace MyLibrary {

MYLIBRARYSHARED_EXPORT Q_NAMESPACE

enum class MYLIBRARYSHARED_EXPORT MyEnumClass {
...
};

Q_ENUM_NS(MyEnumClass)
...
} // namespace MyLibrary
...