当为设备(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 时不会发生这种情况。
在包含此标头的每个 .m 文件中,您将创建一个具有相同名称的新的不同变量。当将所有这些文件链接到单个 .a 中时,编译器可以解决此问题,但是当构建多个 .a 文件并将这些多个 .a 文件链接在一起时,编译器会编译重复的副本。
我会做三件事之一:
- 关闭
const int
into a #define
. #define CONSTANT_NAME 123
- 之前添加静态
const int
. static const int CONSTANT_NAME = 123;
- 之前添加 extern
const int
并添加真实的const int
到一个.m。在.h中,extern const int CONSTANT_NAME;
。在单曲.m中,const int CONSTANT_NAME = 123;
.
对于最后一个,我将创建一个 Constants.m 文件作为单独的位置来保存const int CONSTANT_NAME = 123;
定义。
希望有帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)