Ошибки компоновки библиотеки Qt в Windows

Проект отлично компилируется в 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

Note.MyLibrary deployed to $${IDE_BUILD_TREE}/lib/qtcreator/plugins before build. Building with Qt 5.10.1 and 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-ю?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
1 203
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

@PatrickParker Я расширю и дополню ответ, когда получу больше информации. Просто добавил примечание, чтобы сохранить полезную информацию для решения 1-й проблемы.

Aleksey Kontsevich 27.04.2018 20:54

@PatrickParker OP не добавляет информацию в свой пост - он дает частичный ответ. Я голосую за "выглядит нормально", потому что это реальная попытка ответить на вопрос.

EJoshuaS - Reinstate Monica 27.04.2018 21:40

хорошо, фраза "мой плохой" звучит так, будто вы ошиблись с самим вопросом. может быть, там плохой выбор слов.

Patrick Parker 27.04.2018 22:39

@AlekseyKontsevich спасибо, 3-е исправление было для меня решением.

Baiz 06.09.2018 10:07

Другие вопросы по теме