为啥 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 将我的所有代码编译两次,导致任何全局变量的链接器错误?的主要内容,如果未能解决你的问题,请参考以下文章