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

问题描述 投票:0回答:3

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

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

在链接阶段,我可以看到一次运行针对armv6,另一次运行针对armv7(针对iOS设备进行编译时)。

但是,在为 iOS 模拟器进行编译时,不会出现重复或链接器错误。

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

ios iphone xcode linker-errors
3个回答
2
投票

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


0
投票

简短的回答是,不要使用全局变量。 :D 查找

extern
与objective-c一起使用,它可能会帮助你创建一个全局的。 如果您正在为arm6和arm7构建,您将有重复的构建条目,因为它们是不同的程序集。

当您创建

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


0
投票

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

声明类似于

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;
粘贴到 one 源文件中。

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

© www.soinside.com 2019 - 2024. All rights reserved.