码迷,mamicode.com
首页 > 移动开发 > 详细

iOS开发----duplicate symbol for architecture 重载问题

时间:2015-11-12 16:20:04      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:

之前遇到过几次这种问题,觉得并不是什么太大的问题,就直接把这种问题 pass 掉了,今天给一个小妹妹解决问题,却让我废了一段周折.所以还是在博文上记载一下吧.

今天出现的这个问题的详细错误报告如下:

Ld /Users/home/Library/Developer/Xcode/DerivedData/BaseDraw-cainjridtcbolzatdpicfdxiozma/Build/Products/Debug-iphonesimulator/BaseDraw.app/BaseDraw normal i386
    cd /Users/home/Desktop/1109/BaseDraw
    export IPHONEOS_DEPLOYMENT_TARGET=7.0
    export PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch i386 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator9.1.sdk -L/Users/home/Library/Developer/Xcode/DerivedData/BaseDraw-cainjridtcbolzatdpicfdxiozma/Build/Products/Debug-iphonesimulator -F/Users/home/Library/Developer/Xcode/DerivedData/BaseDraw-cainjridtcbolzatdpicfdxiozma/Build/Products/Debug-iphonesimulator -filelist /Users/home/Library/Developer/Xcode/DerivedData/BaseDraw-cainjridtcbolzatdpicfdxiozma/Build/Intermediates/BaseDraw.build/Debug-iphonesimulator/BaseDraw.build/Objects-normal/i386/BaseDraw.LinkFileList -Xlinker -rpath -Xlinker @executable_path/Frameworks -mios-simulator-version-min=7.0 -Xlinker -objc_abi_version -Xlinker 2 -fobjc-arc -fobjc-link-runtime -Xlinker -dependency_info -Xlinker /Users/home/Library/Developer/Xcode/DerivedData/BaseDraw-cainjridtcbolzatdpicfdxiozma/Build/Intermediates/BaseDraw.build/Debug-iphonesimulator/BaseDraw.build/Objects-normal/i386/BaseDraw_dependency_info.dat -o /Users/home/Library/Developer/Xcode/DerivedData/BaseDraw-cainjridtcbolzatdpicfdxiozma/Build/Products/Debug-iphonesimulator/BaseDraw.app/BaseDraw

duplicate symbol _drawCircle in:
    /Users/home/Library/Developer/Xcode/DerivedData/BaseDraw-cainjridtcbolzatdpicfdxiozma/Build/Intermediates/BaseDraw.build/Debug-iphonesimulator/BaseDraw.build/Objects-normal/i386/MBCircleView.o
    
    /Users/home/Library/Developer/Xcode/DerivedData/BaseDraw-cainjridtcbolzatdpicfdxiozma/Build/Intermediates/BaseDraw.build/Debug-iphonesimulator/BaseDraw.build/Objects-normal/i386/MBHumanView.o
    
ld: 1 duplicate symbol for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)


首先脑补一下.o 文件是什么意思:在 Xcode 中有很多常用的文件类型,最常见的还是.h\.m\.swift,那么问题来了,我们没有编写.o 的文件怎么会出现.o 的文件有重复呢? 众所周知,Xcode 编译器在编译程序的时候要经过三个步骤,分别是:编译---->链接---->运行,这三个步骤少了哪一个都不行.所以.o 文件就是在编译阶段产生的临时文件,也就是说你这个程序在连编译阶段都没过.废话不多说,下面来详细的解决下这种错误的解决办法:

这个错误的提示很明确,就是Xcode 在编译的时候出现了重复文件,而且矛头直接指向的是 MBCircleView.o 和 MBHumanView.o 这两个文件,那么问题来了,罪魁祸首就是在这两个文件当中.一般解决办法可以从以下几个方面考虑一下:

  1. 在使用import 导入 MBCircleView.h 和 MBHumanView.h 的时候,可能是引入头文件,由于疏忽,误引入.m 文件,这种一般仔细检查一下引入的源文件就能找到问题的所在.

  2. 在一个团队协作开发的时候出现这种错误的概率稍微大一点,比如A 小孩创建了一个 MBCircleView 放在A 文件夹下,B 小孩也创建了一个相同名字的 MBCircleView 放在 B 文件夹下.当两个人在合并代码后,编译器会同时编译这两个文件,还是会出现这种错误.

  3. 在 Targets 的 Build Phrases 设置里,查看下 Complie Sources这一项,看看出现问题的类是不是重复的.如果是重复的,删除掉重新添加也能解决这个问题.

  4. 最后单独说下今天我遇到的这个问题, 这个问题相对上面的那些问题还是有点点不太一样的,首先说明一下,这个妹子的代码在.m 文件的函数是用 C 语言的形式写的.

    在 MBCircleView 中的 C 函数的形式如下:

void drawCircle()

      在 MBHumanView 中的 C 函数的形式如下:

void drawCircle(CGContextRef ctx, int radius, CGFloat centerX, CGFloat centerY)

这里大家需要知道一点的是,如果是函数重载,编译的时候只看文件名,而不在乎你后面有多少参数,如果是文件名相同的话也是不行的.所以出现第四种情况的话只要把函数的名字改掉一个即可解决.


著作权声明:本文为作者原创,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢!

iOS开发----duplicate symbol for architecture 重载问题

标签:

原文地址:http://my.oschina.net/u/2458687/blog/529408

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!