泽鑫别偷懒 2024-04-01 11:55 采纳率: 33.3%
浏览 181

用的Xcode 有重复符号的错误

用的Xcode不明白哪里出现了问题,也不能执行出结果,求解决办法。

img

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-01 11:55
    关注

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

    在Xcode中,如果遇到了"Duplicate symbols"的错误提示,这通常发生在以下几种情况下:

    1. 误导入:你可能在一个未编译的项目文件夹中导入了包含重复符号的头文件。这是因为Xcode在编译时检查头文件是否与当前文件完全匹配。如果你在打开一个源文件,发现其中包含多个相同的头文件,编译器可能会认为它们是同一份,从而产生"Duplicate symbols"的错误。

      假设你有一个名为foo.h的头文件,其中有以下内容:

      #include "bar.h"
      

      在你的main.cpp文件中,你也引用了bar.h

      #include "foo.h"
      #include <iostream>
      
      int main()
      {
          // ...
      }
      

      如果你在编译main.cpp时检查这个文件,并发现存在两个相同的bar.h文件(bar1.hbar2.h),那么编译器就会认为这两个头文件是在同一个源文件中被重复使用的,产生"Duplicate symbols"错误。

      解决这个问题的方法有两种:

      a) 删除多余的bar.h头文件: 如果你只是需要将重复的bar.h头文件从源文件中删除,可以在编译阶段通过-fno-common选项(在-Wall-Wextra选项之后添加)来强制Xcode忽略这些文件。这样,在编译main.cpp时,编译器就不会去查找和处理这些重复的bar.h文件。

      clang -Wall -Wextra -fno-common -o output main.cpp bar1.h bar2.h
      

      b) 替换所有依赖于重复头文件的代码: 如果你需要修复整个程序,而不是仅仅移除某个单独的文件,你可能需要在每个函数、类或结构体之前添加一个新的或复杂数量的 #include 链接,指向正确版本的重复头部文件。例如,如果你想要在主函数中引用bar.h中的int integral(int i, int p)函数,你可以这样做:

      #include "foo.h"
      
      void integral(int i, int p)
      {
          // ...
      }
      
      int main()
      {
          // ...
          integral(5, 1); // 编译器会识别并使用1.0作为实数类型,而不是double类型
      }
      

      在这个例子中,由于foo.h文件包含了integral函数,并且你的main.cpp文件引用了此函数,所以编译器在编译时会在main.cpp中找到integral函数,并将其视为可重用的函数,并正常处理其参数。

    总之,解决"Duplicate symbols"错误的最佳方法是在编译main.cpp时通过-fno-common选项或者在包含重复头文件的代码中进行相应的处理。确保你的头文件确实只包含必要的部分,并且没有与已存在的其他头文件冲突,否则编译器就会生成"Duplicate symbols"错误。如果你更倾向于使用代码示例,我可以为你提供一个具体的例子。如果你选择手动处理,我会推荐你遵循上述的步骤,并且在每个源文件中都使用独立的#include链接到不同的版本的重复头部文件。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月1日