在为设备 (ipad 3) 构建时,我的构建工作正常,没有警告或错误,但在为 iPad 或 iPhone 模拟器构建时,我收到如下链接器错误:
duplicate symbol _CONSTANT_NAME in:
/Users/me/libLibrary.a(FileName.o)
/Users/me/libOtherLibrary.a(OtherFileName.o)
常量在头文件中是这样定义的
const int CONSTANT_NAME = 123;
我试过像这样将常量包装在#define 标记中:
#ifndef CONSTANTS_H
#define CONSTANTS_H
const int CONSTANT_NAME = 123;
#endif
为什么这在为设备构建时工作正常,但在为模拟器构建时却出现问题?
最佳答案
编译器告诉你正确的事情。你很幸运,直接构建到你的 iPad 时没有发生这种情况。
在包含此 header 的每个 .m 文件中,您都创建了一个具有相同名称的新的不同变量。编译器可以在将所有这些文件链接到单个 .a 时解决此问题,但是当构建多个 .a 文件并将这些多个 .a 文件链接在一起时,编译器会编译重复的副本。
我会做以下三件事之一:
- 将
const int
转换为#define
。#define CONSTANT_NAME 123
- 在
const int
之前添加 static。static const int CONSTANT_NAME = 123;
- 在
const int
之前添加 extern,并将真正的const int
添加到单个 .m。在 .h 中,extern const int CONSTANT_NAME;
。在单个 .m 中,const int CONSTANT_NAME = 123;
。
对于最后一个,我将创建一个 constants.m 文件作为一个单独的位置来保存 const int CONSTANT_NAME = 123;
定义。
希望对您有所帮助。
关于iphone - 仅在为模拟器构建时复制符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12264997/