Windows 中的 Qt 库 link 错误
Qt library link errors in Windows
项目在 Linux 上构建良好,但在 Windows 中出现问题 link。
第一期:
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.
这里的problem/trick是什么?如何解决?
第二期:
在库 .pro
文件中定义了 VERSION
变量,结果库的名称为 MyLibrary1.lib
。此后我得到错误:
:-1: error: LNK1181: cannot open input file 'MyLibrary.lib'
解决这里问题的更好方法是什么:删除 VERSION
或修复 .pro
文件?怎么样?
第三期:
另一个 link 错误:
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
第三个怎么解决?
第一个问题修复:
我的错误:由于在某些 类' 声明中遗漏了 MYLIBRARYSHARED_EXPORT
而导致的错误,这些声明在全局 header 中定义为:
#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 插件 link 具有主要版本号的库没有问题。如何做到这一点?
第三个问题修复:
还需要在 Q_NAMESPACE
声明前加上 MYLIBRARYSHARED_EXPORT
:
namespace MyLibrary {
MYLIBRARYSHARED_EXPORT Q_NAMESPACE
enum class MYLIBRARYSHARED_EXPORT MyEnumClass {
...
};
Q_ENUM_NS(MyEnumClass)
...
} // namespace MyLibrary
项目在 Linux 上构建良好,但在 Windows 中出现问题 link。
第一期:
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.
这里的problem/trick是什么?如何解决?
第二期:
在库 .pro
文件中定义了 VERSION
变量,结果库的名称为 MyLibrary1.lib
。此后我得到错误:
:-1: error: LNK1181: cannot open input file 'MyLibrary.lib'
解决这里问题的更好方法是什么:删除 VERSION
或修复 .pro
文件?怎么样?
第三期:
另一个 link 错误:
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
第三个怎么解决?
第一个问题修复:
我的错误:由于在某些 类' 声明中遗漏了 MYLIBRARYSHARED_EXPORT
而导致的错误,这些声明在全局 header 中定义为:
#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 插件 link 具有主要版本号的库没有问题。如何做到这一点?
第三个问题修复:
还需要在 Q_NAMESPACE
声明前加上 MYLIBRARYSHARED_EXPORT
:
namespace MyLibrary {
MYLIBRARYSHARED_EXPORT Q_NAMESPACE
enum class MYLIBRARYSHARED_EXPORT MyEnumClass {
...
};
Q_ENUM_NS(MyEnumClass)
...
} // namespace MyLibrary