如何说服Xcode发出重复的符号链接器错误?

Bob*_*phy 6 macos xcode linker ld

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

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

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

很明显,原作者认为他们具有特定于文件的范围,但忽略了将这些行中的任何一行作为"静态"前缀.这很好,很容易修复.

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

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

Bob*_*phy 3

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

我之前发过帖子:

因此,如果您将 Xcode 与 LLVM GCC 4.2 一起使用,请转到构建设置对话框,找到“LLVM GCC 4.2 - 代码生成”部分,然后选中“无公共块”复选框。这将启用编译器的“-fno-common”选项,并更改目标文件生成,以便如果不同源文件中有两个同名全局变量,ld 将阻塞并发出错误。

不幸的是,这似乎并不能解决所有情况。如果所有全局变量都具有相同的类型,那么似乎工作得很好。

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