当我查看“构建结果”窗口时,每个 Compile .m、Precompile .pch 和 Link 都有重复的条目。
每当我尝试添加全局变量(即使作为静态常量)时,我都会收到链接器错误。
在链接阶段,我可以看到一次运行针对armv6,另一次运行针对armv7(针对iOS设备进行编译时)。
但是,在为 iOS 模拟器进行编译时,不会出现重复或链接器错误。
这是一个问题吗(除了链接器错误的明显问题之外)?如果是这样,会导致性能问题吗?我该如何纠正这个问题?
我很确定双重消息是由通用应用程序编译引起的。
简短的回答是,不要使用全局变量。 :D 查找
extern
与objective-c一起使用,它可能会帮助你创建一个全局的。 如果您正在为arm6和arm7构建,您将有重复的构建条目,因为它们是不同的程序集。
当您创建
static const
作为全局变量时,可能会发生的情况是它会在每个文件中定义。 将其放入 one .m 文件中,并在其他文件中添加 extern
关键字。 然而,这可能是错误的,因为我不使用全局变量。 (你也不应该:D)
您不应该将定义放在头文件中。
声明类似于
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要快得多。)