Проект отлично компилируется в Linux, но имеет проблемы со связыванием в Windows.
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.
MyLibrarydeployed to$${IDE_BUILD_TREE}/lib/qtcreator/pluginsbefore build. Building with Qt 5.10.1 and MSVC 2015.
В чем тут проблема / хитрость? Как решить?
В файле библиотеки .pro определена переменная VERSION и получившаяся библиотека имеет имя MyLibrary1.lib. После этого я получаю сообщение об ошибке:
:-1: error: LNK1181: cannot open input file 'MyLibrary.lib'
Как лучше решить проблему: удалить VERSION или исправить файл .pro? Как?
Другая ошибка ссылки:
mydialog.obj:-1: error: LNK2001: unresolved external symbol
"struct QMetaObject const MyLibrary::staticMetaObject"
(?staticMetaObject@MyLibrary@@3UQMetaObject@@B)
Ошибка возникает из-за следующей строки кода (исчезает при закомментировании):
QMetaEnum myEnum = QMetaEnum::fromType<MyLibrary::MyEnumClass>();
namespace MyLibrary {
Q_NAMESPACE
enum class MYLIBRARYSHARED_EXPORT MyEnumClass {
...
};
Q_ENUM_NS(MyEnumClass)
...
} // namespace MyLibrary
А как решить 3-ю?





Моя проблема: ошибка, вызванная пропущенным 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.
Возможное решение - добавить в файл .pro строку:
win32:CONFIG += skip_target_version_ext
или же
win32:TARGET_EXT = .dll
чтобы установить имя выходного файла без основного номера версии в Windows. Однако я вижу, например, что подключаемые модули Qt Creator без проблем связывают библиотеки с основным номером версии. Как это сделать?
Необходимо также добавить декларацию Q_NAMESPACE к MYLIBRARYSHARED_EXPORT:
namespace MyLibrary {
MYLIBRARYSHARED_EXPORT Q_NAMESPACE
enum class MYLIBRARYSHARED_EXPORT MyEnumClass {
...
};
Q_ENUM_NS(MyEnumClass)
...
} // namespace MyLibrary
@PatrickParker OP не добавляет информацию в свой пост - он дает частичный ответ. Я голосую за "выглядит нормально", потому что это реальная попытка ответить на вопрос.
хорошо, фраза "мой плохой" звучит так, будто вы ошиблись с самим вопросом. может быть, там плохой выбор слов.
@AlekseyKontsevich спасибо, 3-е исправление было для меня решением.
@PatrickParker Я расширю и дополню ответ, когда получу больше информации. Просто добавил примечание, чтобы сохранить полезную информацию для решения 1-й проблемы.