码农永闯天涯 2024-06-18 03:30 采纳率: 0%
浏览 25
已结题

关于c++外部库文件宏的问题,求解

代码编辑器:vs2019
语法:c++
。我最近用cmake软件编译了一个库,要用在我的项目里面。我想用一下里面的一个文件中的函数。比如就叫temp.h文件吧。然后我就在我的main函数中去用了。但是我调用的那个temp.h那个文件中的函数A()是这样写的,它功能是判断是不是宏定义了CC,如果宏定义了就返回true否则返回false。我在项目的属性里面的预编译器中设置了这个CC宏。但是我调用这个函数还是返回的false。但是如果我把这个temp.cpp文件放到我的项目下面当成一个cpp文件。然后在运行就变成true了。这是怎么回事。加班到现在我都没搞出来。而且temp.cpp文件在最开头也定义了宏CC。为啥链接进项目函数返回的是false,而把文件放到项目下面就是true了呢。
我把文件放到项目下面会报错temp.cpp文件一些函数重定义,我知道这个重定义是和我链接进来的包含temp.cpp的lib库有冲突。我把那些冲突函数注释了之后,就可以运行出来A()是true。但是我注释的那些函数正是我想要用的函数。求指点。真的很迷。

  • 写回答

16条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-18 03:30
    关注

    引自免费微信小程序:皆我百晓生

    面对你所描述的情况,确实存在一些复杂性,但让我们一步步解析并解决这个问题。你提到的temp.h中的函数A()用于检查是否定义了宏CC。在VS2019中通过预处理器定义宏,并且在使用外部库时遇到了不一致的行为。下面是一些可能的解释和解决方案:

    1. 理解宏定义与源文件位置的关系

    • 宏的作用范围:宏定义在编译期间生效,其作用域通常限于定义它的源文件或在编译命令中指定的预处理指令。
    • 链接与编译的区别:将temp.cpp作为一个单独的文件链接到你的项目中,与将它作为项目的一部分进行编译有所不同。在链接阶段,宏定义不会被重新评估,这意味着在编译temp.cpp时,其中的宏状态决定了函数A()的行为。

    2. 解决方案

    a. 确保宏定义正确传播

    • 在CMakeLists.txt中定义宏:确保在你的CMakeLists.txt文件中,所有目标都包含了宏定义。例如:

      add_definitions(-DCC)
      
    • 检查CMake缓存:确认CMake缓存中没有错误地覆盖或遗漏了宏定义。

    b. 避免重复定义

    • 修改temp.h:在temp.h中使用#ifndef#define#endif来防止头文件被多次包含时定义宏多次。例如:

      #ifndef TEMP_H
      #define TEMP_H
      
      #ifdef CC
          // 函数定义
      #else
          // 函数定义
      #endif
      
      #endif // TEMP_H
      
    • 使用条件编译:在temp.cpp中,可以使用条件编译来避免重复定义错误。例如:

      #ifdef CC
      // 在宏CC定义的情况下才编译这部分代码
      #endif
      

    3. 检查和调整编译命令

    • 检查预处理器定义:在VS2019中,通过“属性 > C/C++ > 预处理器 > 预处理器定义”确保CC宏被正确添加。

    4. 测试和验证

    • 创建测试项目:创建一个最小的测试项目,仅包含temp.h和temp.cpp,以及你定义的宏CC,确保在这个环境中函数A()的行为符合预期。

    5. 调试宏定义

    • 使用预处理器日志:在CMakeLists.txt中加入add_compile_options(/Zi /Fd"$<TARGET_FILE_DIR:YourTargetName>.pdb")来启用调试信息,然后在源代码中使用__FILE____LINE__宏来输出宏定义的状态和位置。

    遵循上述步骤应该能帮助你定位问题所在,并解决宏定义和函数行为的不一致性。如果仍然遇到困难,考虑在社区论坛或相关开发人员交流平台提问,提供更详细的代码片段和编译环境配置,以获得更具体的帮助。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月18日
  • 创建了问题 6月18日

悬赏问题

  • ¥15 咨询一下有关于王者荣耀赢藏战绩
  • ¥100 求购一套带接口实现实习自动签到打卡
  • ¥50 MacOS 使用虚拟机安装k8s
  • ¥500 亚马逊 COOKIE我如何才能实现 登录一个亚马逊账户 下发新 COOKIE ..我使用下发新COOKIE 导入ADS 指纹浏览器登录,我把账户密码 修改过后,原来下发新COOKIE 不会失效的方式
  • ¥20 玩游戏gpu和cpu利用率特别低,玩游戏卡顿
  • ¥25 oracle中的正则匹配
  • ¥15 关于#vscode#的问题:把软件卸载不会再出现蓝屏
  • ¥15 vimplus出现的错误
  • ¥15 usb无线网卡转typec口
  • ¥30 怎么使用AVL fire ESE软件自带的优化模式来优化设计Soot和NOx?