iphone - 仅在为模拟器构建时复制符号

标签 iphone objective-c ios xcode ios-simulator

在为设备 (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 文件链接在一起时,编译器会编译重复的副本。

我会做以下三件事之一:

  1. const int 转换为 #define#define CONSTANT_NAME 123
  2. const int 之前添加 static。 static const int CONSTANT_NAME = 123;
  3. 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/

相关文章:

ios - 如何使用FBSDKLoginManager进行FB登录?

iphone - UIPickerView 不显示数据

iphone - performBlock 在哪个线程上运行?

ios - 如何形成一个 if 语句来选择几个字典中的一个?

ios - 带有 Swift 滑动菜单的空白菜单按钮

iphone - 自动检查 iOS < 4.0 不支持的 API 调用?

iphone - 应用内购买 - 消耗品

ios - 如何在 Swift 中将 cornerRadius 添加到 AVPlayerViewController?

ios:捏手势只发生一次

iphone - 堆叠的 UIView 层不会移动