vs2019静态库项目会默认有一个头文件(如qcommon_global.h),如下:
#pragma once
#include <QtCore/qglobal.h>
#ifndef BUILD_STATIC
# if defined(QCOMMON_LIB)
# define QCOMMON_EXPORT Q_DECL_EXPORT
# else
# define QCOMMON_EXPORT Q_DECL_IMPORT
# endif
#else
# define QCOMMON_EXPORT
#endif
静态库编译时,因为默认定义了BUILD_STATIC,所以QCOMMON_EXPORT宏默认为空,可以正常编译并生成lib。
但是在exe项目中链接该lib时,如果也带上这个头文件,那么QCOMMON_EXPORT宏的定义就是Q_DECL_IMPORT,这个是动态链接库(dll)链接时需要的,静态库就会报错。
解决方法就是静态库的头文件中去掉Q_DECL_IMPORT宏,或者重新定义Q_DECL_IMPORT宏为空,不要用默认头文件(qcommon_global.h)中的定义。
另外还有一种情况也会报LNK2019错误,看一个示例:
class MyMsg;
class test
{
int doPublish(const MyMsg& msg);//发送消息
};
这样能够正常编译,但是因为test的头文件中只有MyMsg的声明,没有定义,实际调用doPublish的时候就会报LNK2019错误。这时候就要把class MyMsg的头文件放进来。