Qt中MinGW编译器可以正常识别extern的变量,但是MSVC报错
MinGW
MSVC
参考免费微信小程序:皆我百晓生 作答,经由专家-皆知整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。
遇到在Qt项目中MSVC编译器无法解析extern
变量,而MinGW可以的情况,通常是因为变量的定义与引用之间存在链接问题。以下是一些可能的解决方案和检查步骤:
确保extern
声明对应的变量在项目中的某个 .cpp
文件中有且仅有一个实际定义。例如,如果你在头文件中声明了:
// myGlobalVars.h
extern int count;
extern IP *ips;
extern IP ip;
那么在某个 .cpp
文件中(比如 main.cpp
),你应该有这些变量的实际定义:
// main.cpp
#include "myGlobalVars.h"
int count = 0;
IP *ips = nullptr;
IP ip = { /* 初始化值 */ };
确保所有相关的源文件和对象文件都被包含在构建过程中。在Qt Creator中,检查.pro
文件确保所有必要的文件都通过SOURCES +=
被添加。
对比MinGW和MSVC的构建日志,查看是否有编译选项或链接顺序的不同。有时,链接顺序会影响静态变量的解析。
在提供的文本中,#ifdef ___cplusplus
和 #ifndef C_H
的写法看起来有些混乱。确保预处理器指令正确无误。正确的写法应该是:
#ifndef C_H
#define C_H
#ifdef __cplusplus
extern "C" {
#endif
// ...你的声明
#ifdef __cplusplus
}
#endif
#endif // C_H
对于Qt项目,确保在MSVC套件下的项目设置没有遗漏或错误配置的地方,特别是关于包含目录和库路径的设置。
myGlobalVars.h
#ifndef MYGLOBALVARS_H
#define MYGLOBALVARS_H
struct IP {
char *ip;
};
extern int count;
extern IP *ips;
extern IP ip;
#endif // MYGLOBALVARS_H
main.cpp
#include <iostream>
#include "myGlobalVars.h"
// 实际定义
int count = 0;
IP *ips = nullptr;
IP ip = {"127.0.0.1"}; // 初始化示例
int main() {
std::cout << "count: " << count << std::endl;
std::cout << "ip: " << ip.ip << std::endl;
return 0;
}
确保在实际项目中,extern
声明和定义遵循上述原则,并且在编译时没有遗漏任何关键文件或设置。如果问题依然存在,详细检查项目的构建日志以寻找更具体的线索。