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

之前遇到过几次这种问题,觉得并不是什么太大的问题,就直接把这种问题 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)

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

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

时间: 2025-01-06 23:42:02

iOS开发----duplicate symbol for architecture 重载问题的相关文章

iOS开发- "duplicate symbol for architecture i386" 解决办法

今天整合项目的时候, 遇到了这样一个问题. duplicate symbol _flag in: /Users/apple/Library/Developer/Xcode/DerivedData/bluetoothPhone-fspknidhnizzjygmuqngfcklvnic/Build/Intermediates/bluetoothPhone.build/Debug-iphonesimulator/bluetoothPhone.build/Objects-normal/i386/Dial

iOS开发-duplicate symbols for architecture armv7解决方案

今天修改了自己项目的部分代码,发现XCode编译的时候报错:duplicate symbols for architecture armv7 1.排查是否有名字重复的文件: 2.检查是否在#import头文件的时候,不小心将.h写成了.m(这种情况居多,本人属于此类情况)

duplicate symbol for architecture x86_64

今天即成iPhone内购的时候出现了个duplicate symbol for architecture x86_64,c语言的枚举不能在Xcode直接使用所致,但是真机可以编译通过:后续更新 enum{IAP0p20=20,IAP1p100,IAP4p600,IAP9p1000,IAP24p6000,}buyCoinsTag; typedef NS_ENUM(NSInteger, buyCoinsTag){ IAP0p20=20, IAP1p100, IAP4p600, IAP9p1000,

由于枚举类型导致的1 duplicate symbol for architecture x86_64错误

错误如下: duplicate symbol _iphoneType in: /Users/midmirror/Library/Developer/Xcode/DerivedData/PRTPrinter-eixyioynyswgruahtmzninftkbmm/Build/Intermediates/PRTPrinter.build/Debug-iphonesimulator/PRTPrinter.build/Objects-normal/x86_64/PRTScreenFit.o /User

xcode上编译c语言程序报错:ld: x duplicate symbol for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

在网上查了一下: duplicate symbol的大概意思是,编译器认为你重复定义了一些东西. linker command failed with exit code 1,则可能是项目引入了多个相同的文件. 结合本人开发中发现此类的问题,解决办法如下: 方法1:查看有问题的文件是否有重复引用.或头文件是否加载了.m 方法2:将有问题的文件删除,重新加载进去.然后:clean->build. 在开发中解决RegexKitlLite的类似问题办法: _rkl_NSExceptionForRege

【iOS】duplicate symbols for architecture x86_64

今天遇到了这个问题,错误如下: duplicate symbol _OBJC_IVAR_$_BCViewController.bank in: /Users/***/Library/Developer/Xcode/DerivedData/***-fmtpkcbvfajuuadtvwtzfyjxoywz/Build/Intermediates/***.build/Debug-iphonesimulator/***.build/Objects-normal/x86_64/BCViewControll

iOS之duplicate symbols for architecture x86_64错误

在我们写代码过程中可能会经常遇到这样一个错误: [objc] view plain copy print? <span style="font-size:32px;color:#ff0000;">ld: 4 duplicate symbols for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)</span>

IOS 开发学习37 的Architecture与iphone版本对应关系

简介 Arm是处理器是移动设备上占用率最大的处理器. armv6.armv7.armv7s.arm64都是arm处理器的指令集.通常指令是向下兼容的.在模拟器运行时,iOS模拟器运行的是x86指令集.只有在真机上,才会对执行arm指令集. 如果出现错误: "OBJC_CLASS$_xx文件名", referenced from: linker command failed with exit code 1 (use -v to see invocation) 要设置: Build Ac

&amp;quot;duplicate symbol for architecture i386&amp;quot; 解决的方法

我在写项目的过程中,碰到了这个错误,我在网上查了一下,发现这个错误的原因是,project里面有反复的类. 解决方式:找到反复的类,然后删除掉就好了. 分析一下, 如图. 能够看出, 错误类型是 duplicate(反复) 错误标识是 _flag  错误位置在 DialVC 和 PersonalList中 于是, 搜索一下, flag.发现... watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvenVveW91MTMxNA==/font/5a6L5L2T