【问题标题】:How can I convince Xcode to emit a duplicate symbol linker error?如何说服 Xcode 发出重复的符号链接器错误?
【发布时间】:2011-07-21 15:37:50
【问题描述】:

这与通常对重复符号错误的混淆不同... :-)

我正在一个 Xcode 项目中处理一些遗留的 Mac 代码,该项目具有相同的全局“跟踪”,在几个不同的源文件中定义 - 例如:

  • File1.c:SInt32 跟踪;
  • File2.c:布尔跟踪;

等等。很明显,原作者的意思是它们具有特定于文件的范围,但只是忽略了在任何这些行前面加上“静态”。这很好,很容易修复。

但我有点震惊链接器没有标记这些!在我看来,Xcode 的链接器(我认为是 gnu ld)只为链接到代码段的函数发出重复的符号警告或错误,而不是链接到数据段的全局变量。相反,它默默地将它们混为一谈,这会导致错误。

那么...我如何说服 Xcode 为重复的全局变量发出链接错误?或者以其他可以成为我构建的常规部分的方式获取这些信息?

【问题讨论】:

    标签: xcode macos linker ld


    【解决方案1】:

    好吧,我以为我已经回答了我自己的问题... :-)

    我之前发过:

    因此,如果您将 Xcode 与 LLVM GCC 一起使用 4.2、进入构建设置对话框,找到“LLVM GCC 4.2 - Code 代”部分,并检查“否 公共块”复选框。这使 编译器的“-fno-common”选项, 并更改目标文件生成 这样 ld 会窒息并发出 如果您有两个全局变量,则错误 不同的源文件具有相同的 名字。

    不幸的是,这似乎并不能解决所有情况。如果所有全局变量都具有相同的类型,它似乎可以正常工作。

    但问题中的示例直接取自代码,其中名为“trace”的变量在具有两种不同类型的两个不同文件中定义为全局变量。当我选中该复选框时,构建系统仍然没有捕捉到这一点。

    【讨论】:

    • 如果你有一个实例,可能会在整个项目范围内搜索有问题的文章?
    • 嗯,是的,一旦您知道有问题的变量名称是什么,这就是修复的一部分。问题是,你如何首先找到它们?链接器知道存在名称冲突,问题是,如何说服它投诉?
    • 我暂时对此进行了抨击。 :-(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 2011-02-26
    相关资源
    最近更新 更多