为啥 Xcode 将我的所有代码编译两次,导致任何全局变量的链接器错误?

Posted

技术标签:

【中文标题】为啥 Xcode 将我的所有代码编译两次,导致任何全局变量的链接器错误?【英文标题】:Why is Xcode compiling all of my code twice, resulting in linker errors for any globals?为什么 Xcode 将我的所有代码编译两次,导致任何全局变量的链接器错误? 【发布时间】:2010-11-23 19:24:25 【问题描述】:

当我查看构建结果窗口时,每个 Compile .m、Precompile .pch 和 Link 都有重复的条目。

每当我尝试添加全局变量时,即使是作为静态常量,我都会收到链接器错误。

在链接阶段,我可以看到一个运行是针对 armv6,另一个是针对 armv7(在为 ios 设备编译时)。

但是,在为 iOS 模拟器编译时没有复制完成或链接器错误。

这是一个问题吗(除了链接器错误的明显问题)?如果是这样,它会导致性能问题吗?我该如何纠正这个问题?

【问题讨论】:

【参考方案1】:

我很确定双重消息是由通用应用程序编译引起的。

【讨论】:

【参考方案2】:

简短的回答是,不要使用全局变量。 :D Look up extern use with objective-c,它可以帮助你创建一个全局。如果您正在为 arm6 和 arm7 构建,您将拥有重复的构建条目,因为它们是不同的程序集。

当您将static const 创建为全局变量时,可能会在每个文件中定义它。将其放入 one .m 文件中,并在其他文件中添加 extern 关键字。但是,这可能是错误的,因为我不使用全局变量。 (你也不应该:D)

【讨论】:

全局常量没什么问题,就是全局变量。我更喜欢对这些全局常量使用静态常量而不是#define,因为它允许您定义类型。 但是,我认为static关键字会阻止在其他文件中定义全局? @Jordan,我不认为static 让它变得更好。您需要像C 那样使用extern 来制作全局常量【参考方案3】:

您不应该将定义放在头文件中。

声明类似于int add(int a, int b);extern int c;

定义类似于int add(int a, int b) return a+b; int c;

如果您在头文件中定义全局变量int c;,每个#include 的源文件都会定义一个名为“c”的符号。链接器不喜欢它:有 2(或 3,或 4...)个不同的东西称为 c,但它们都需要指向同一个。它应该使用哪一个? (相当于定义了两个(非静态)同名的函数,或者是两个同名的类。)

相反,在头文件中粘贴extern int c;,在一个源文件中粘贴int c;

(armv6 和 armv7 的“重复”编译是完全正常的。两种架构分别编译和链接,然后编译成“胖”可执行文件。粗略地说,armv6 在“旧”设备(3GS 之前)上运行,并且armv7 在“新”设备(3GS+)上运行。“新”设备也可以运行 armv6,但 armv7 更快。)

【讨论】:

以上是关于为啥 Xcode 将我的所有代码编译两次,导致任何全局变量的链接器错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 XCode 启动应用程序两次以运行 UI 测试?

为啥我需要运行两次 makefile 来编译我的代码

为啥我的 Xcode 机器人会触发两次?

为啥 ngAfterContentInit 钩子被调用两次?

为啥我的代码在完成块中运行两次

为啥我的对象更新为 MagicalRecord 持久存储执行了两次?