m0_61770108 2024-04-30 11:15 采纳率: 29.4%
浏览 1

MSVC无法解析extern的变量

Qt中MinGW编译器可以正常识别extern的变量,但是MSVC报错
MinGW

img


MSVC

img

  • 写回答

4条回答 默认 最新

  • 专家-皆知 2024-04-30 11:15
    关注

    参考免费微信小程序:皆我百晓生 作答,经由专家-皆知整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。

    遇到在Qt项目中MSVC编译器无法解析extern变量,而MinGW可以的情况,通常是因为变量的定义与引用之间存在链接问题。以下是一些可能的解决方案和检查步骤:

    1. 确保变量定义唯一且正确放置

    确保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 = { /* 初始化值 */ };
    

    2. 链接问题检查

    确保所有相关的源文件和对象文件都被包含在构建过程中。在Qt Creator中,检查.pro文件确保所有必要的文件都通过SOURCES +=被添加。

    3. 分析编译和链接命令

    对比MinGW和MSVC的构建日志,查看是否有编译选项或链接顺序的不同。有时,链接顺序会影响静态变量的解析。

    4. 检查预处理器宏

    在提供的文本中,#ifdef ___cplusplus#ifndef C_H 的写法看起来有些混乱。确保预处理器指令正确无误。正确的写法应该是:

    #ifndef C_H
    #define C_H
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    // ...你的声明
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif // C_H
    

    5. 项目配置检查

    对于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声明和定义遵循上述原则,并且在编译时没有遗漏任何关键文件或设置。如果问题依然存在,详细检查项目的构建日志以寻找更具体的线索。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月30日

悬赏问题

  • ¥15 数学建模求思路及代码
  • ¥50 silvaco GaN HEMT有栅极场板的击穿电压仿真问题
  • ¥15 谁会P4语言啊,我想请教一下
  • ¥15 哪个tomcat中startup一直一闪而过 找不出问题
  • ¥15 这个怎么改成直流激励源给加热电阻提供5a电流呀
  • ¥50 求解vmware的网络模式问题 别拿AI回答
  • ¥24 EFS加密后,在同一台电脑解密出错,证书界面找不到对应指纹的证书,未备份证书,求在原电脑解密的方法,可行即采纳
  • ¥15 springboot 3.0 实现Security 6.x版本集成
  • ¥15 PHP-8.1 镜像无法用dockerfile里的CMD命令启动 只能进入容器启动,如何解决?(操作系统-ubuntu)
  • ¥30 请帮我解决一下下面六个代码