先吐槽一下Windows的导出库形式真的很麻烦
假设你的dll头文件
#if defined(_MSC_VER) || defined(WIN64) || defined(_WIN64) || defined(__WIN64__) || defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)
# define Q_DECL_EXPORT __declspec(dllexport)
# define Q_DECL_IMPORT __declspec(dllimport)
#endif
#if defined(LIBRARY)
# define TESTLIB_EXPORT Q_DECL_EXPORT
#else
# define TESTLIB_EXPORT Q_DECL_IMPORT
#endif
#include "QObject"
class TESTLIB_EXPORT TestClass : public QObject
{
Q_OBJECT // 此处使用了 Q_Object宏
......
}
当你编译动态库的时候, 编译的是
# define Q_DECL_EXPORT __declspec(dllexport)
这样才会导出lib文件, 不加这一条是不会导出lib, 只有dll
当用户使用你的库的时候, 编译的是
# define Q_DECL_IMPORT __declspec(dllimport)
因为你的动态库项目.pro文件里面有这一行
DEFINES += LIBRARY
但是用户使用你的动态库无法编译通过的, 因为你的库带有带有Q_OBJECT 宏, 会报C2491的错误。
原因就是 __declspec(dllimport)
你需要把这个屏蔽掉
即为
#if defined(_MSC_VER) || defined(WIN64) || defined(_WIN64) || defined(__WIN64__) || defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)
# define Q_DECL_EXPORT __declspec(dllexport)
# define Q_DECL_IMPORT __declspec(dllimport)
#endif
#if defined(LIBRARY)
# define TESTLIB_EXPORT Q_DECL_EXPORT
#else
# define TESTLIB_EXPORT //此处删除 Q_DECL_IMPORT
#endif
#include "QObject"
class TESTLIB_EXPORT TestClass : public QObject
{
Q_OBJECT // 此处使用了 Q_Object宏
......
}