Xcode 中大量报重复引用错误的一种可能

  在重构程序修改了许多地方代码后运行,xcode 报了1k+的重复引用错误,经过排查发现是常量定义出现的,在此引用stackoverflow上的一段回答解释。

原回答link http://stackoverflow.com/questions/16144666/apple-mach-o-linker-error-with-duplicate-symbols-even-after-linking-the-m-class

  事实上是在一个全局参数头文件.h中使用const来定义常量导致出错  改用define后就可以。

  但是只是用define无法对指针进行比较操作,更好的方法是使用const来定义。

  extern c关键字,表示这个变量已经声明,只是引用。const关键字表示变量是常量,不可修改。

#import

extern NSString * const kInitURL;

@interface Constants : NSObject {

}

@end

  .m文件赋值

#import "Constants.h"

NSString * const kInitURL = @"http://marshal.easymorse.com";

@implementation Constants

@end


  之后引入Constans.h就可以使用常量了。



参考:

  This is really really basic beginner stuff that suggests to me you don't understand the difference between C-family language's "header files" and "implementation files".Did you search your project and not notice that you are declaring variables in header files but without extern? You even had the name of the global variable in your linker error. Yes, global variables are emitted as symbols into object files (.o) and if you include a header into three files and all three files then declare the same global variable, you get this error. It was for just this issue that the mighty and wonderful extern keyword was invented.In the context of header files you should not declare actual variables, only extern references to them. This is something you should learn on your first day of C, C++ or Objective C programming. You can however put code into header files, but then, every file you include that header into will generate a duplicate set of symbols, leading to link errors, and further accelerating the pace of global warming, and causing the melting of icebergs. (Just kidding about that last part.)Here is your mistake, this is a header file but you are treating it like it was an implementation file and declaring not external-variable-declarations but actual-emit-the-global-variable-into-the-object-file declarations:

#importUIImage *SavedImage;

UIImage *SavedImage1;

NSString * vvvalue;

//UILabel * l2;

NSString * lll;

@interface NSObject (ShareClass)

@end

  You tell me now. Where should the keyword extern appear in the code sample above? Where does the real "emit this variable into object file" declaration of a variable go? In a header file? NO. In the implementation file (.m or .c or .cpp as the case may be).

  Secondly, after you add the extern keyword, you now have a second problem. You probably need to add the real declaration of that global variable in your corresponding .m file. Yes, that's right you have to "declare" every global twice in a C-family language program. once as extern in header files if you really need all the modules in your system to be able to see that global variable, and once without the extern keyword, in only one of your .m files.

  Of course, you do know that such "global variable mess" is to be avoided, and is terrible programming practice right? You should be thinking about keeping global variables out of your code, and have variables that limit their scope to a single implementation module wherever possible.

  In .h file:

extern UIImage * myImage;

  In .m file: 

UIImage *myImage;

  Go read your book on what the extern keyword means please. Also, I suspect that you might have meant to do this:

@interface NSObject (ShareClass)

UIImage * InstanceVariable;

@end

  The above is an instance variable (belongs to each instance of the class). It is common if you need to group some stuff and put it inside an object not to make it a global variable.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,417评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,921评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,850评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,945评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,069评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,188评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,239评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,994评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,409评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,735评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,898评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,578评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,205评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,916评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,156评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,722评论 2 363
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,781评论 2 351

推荐阅读更多精彩内容