1.以如下错误为例,如果是多人开发,你同步完成后发现出现如下的错误。
xcode 4 导入Lib,Framework的方法,和Undefined symbols for architecture x86_64:的一种解决办法

(2012-04-04 21:35:43)

转载▼
标签: xcode
framework
iconv
sqlite
it 分类: Object-C
最近在使用 sqlite 和 iconv 写一些东西,但是在链接的时候出现了错误。
Undefined symbols for architecture x86_64:
"_iconv_open", referenced from:
_main in main.o
"_iconv", referenced from:
_main in main.o
"_iconv_close", referenced from:
_main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
后来发现xcode就算使用系统自带的头文件也需要导入lib(sqlite和iconv,Mac都自带),也就是说,单单包含头文件是不够的,还需要加入lib或Framework,具体方法如下:

加上以后,一切正常。我之前都是直接拿源码来编译来避免这个错误。。。每次调试编译半天。后来才发现原来要这么解决。
错误-duplicate symbols for architecture i386
(2012-10-29 21:52:55)

转载▼
标签: duplicate
architecturei386
architecture
i386
symbols 分类: 错误分析
编译程序时,出现:XX duplicate symbols for architecture i386 的错误。
调试了很久,就是找不出来,因为没有错误提示。
从字面上说,是冲突了。到底那里冲突了呢?
后来才恍然大悟,一个项目中不可能有两个main入口吧。郁闷啊。删除不需要的那一个,ok了。
记录下来,希望大家不要走弯路。
还有一种,Undefined symbols for architecture i386:
说明缺少某种框架,或者类。
根据提示进行添加某些框架或者类。
这两种情况一般在多个人进行开发,或者多个项目进行整合、复用代码拷贝的时候,往往出现这种问题。
Duplicate Symbol链接错的原因总结和解决方法
duplicate symbol是一种常见的链接错误,不像编译错误那样可以直接定位到问题的所在。但是经过一段时间的总结,发现这种错误总是有一些规律可以找的。
例如,我们有如下的最简单的两个类代码:
// ClassA.h
#import <Foundation/Foundation.h>
@interface ClassA : NSObject
@end
// ClassA.m
#import "ClassA.h"
@implementation ClassA
@end
// ClassB.h
#import <Foundation/Foundation.h>
@interface ClassB : NSObject
@end
// ClassB.m
#import "ClassB.h”
@implementation ClassB
@end
编译后出现的错误信息如下:
duplicate symbol _OBJC_METACLASS_$_ClassA in:
/Users/dajie/Library/Developer/Xcode/DerivedData/linkTest-cpjaaatiyqpvxcbzfzpklcbqrgqg/Build/Intermediates/linkTest.build/Debug-iphonesimulator/linkTest.build/Objects-normal/i386/ClassA.o
/Users/dajie/Library/Developer/Xcode/DerivedData/linkTest-cpjaaatiyqpvxcbzfzpklcbqrgqg/Build/Intermediates/linkTest.build/Debug-iphonesimulator/linkTest.build/Objects-normal/i386/ClassB.o
duplicate symbol _OBJC_CLASS_$_ClassA in: /Users/dajie/Library/Developer/Xcode/DerivedData/linkTest-cpjaaatiyqpvxcbzfzpklcbqrgqg/Build/Intermediates/linkTest.build/Debug-iphonesimulator/linkTest.build/Objects-normal/i386/ClassA.o
/Users/dajie/Library/Developer/Xcode/DerivedData/linkTest-cpjaaatiyqpvxcbzfzpklcbqrgqg/Build/Intermediates/linkTest.build/Debug-iphonesimulator/linkTest.build/Objects-normal/i386/ClassB.old: 2
duplicate symbols for architecture i386clang:
error: linker command failed with exit code 1 (use -v to see invocation)
从上面出现问题的地方,我们应该能推测出是ClassA这个类出了问题。如果这个类是我们自己写的,就容易办一些。
可以考虑以下原因:
1.引入头文件时,由于疏忽,误引入.m文件。这种一般仔细检查一下出现问题的类的源文件就能发现。
例:ClassB.m 文件修改成下面这样
#import "ClassB.h>"
#import "ClassA.m” // 这句话有问题
@implementation ClassB
@end
2.同一个类,实现两次,即有两个@implementation 。这种一般会有一个警告,也比较容易发现。
例:ClassB.m文件修改成下面这样:
// ClassB.m
#import "ClassB.h”
@implementation ClassB
@end
@implementation ClassA
@end
3.工程文件,同一个类文件被引入了两次,引起这种错误的原因大概有两种:一是多人协作开发时,导致project文件合并冲突;二是同名文件不在同一目录下,添加到工程时造成重复添加。 这种一般在文件视图,用名字过滤器检查一下就发现了。
4. Targets的Build Phase设置项里,查看Complie Sources这一项,看看出现问题的类是不是有重复的,用文件名过滤也比较容易发现。这种问题一般也是多人协作开发时,project文件冲突导致的。 发现这种问题,只要删除就可以了。不过在我解决问题过程中,删除其中一个文件时,重复文件会自动全部删除,所以还需要单独添加一下。
5.如果我们的工程中引用了第三方的库,而恰好第三方的库里面有一个ClassA,也会出现这种问题。如果不能修改第三方的库代码,只能修改我信自己的代码了。
由于最近刚接手做静态库的同事的工作,这样难免的集成调试啊,但是集成之后老是出现linker command failed with exit code 1这个错误,查了许多资料,最后终于解决了,今天就这个问题做个探讨,以防止以后犯同样的错误,我先说下我这个项目里面错误的解决办法,然后再笼统的说下 其他的解决办法。。

好,这是我出现 linker command failed with exit code错误的解决办法,也是出现这个错误的原因之一,静态库的响应路径不对.
好,下面就出现 linker command failed with exit code错误的所有解决办法列举出来,以备后用
1.多人开发的文件冲突或者.m未添加问题,如下错误:<喎?http:///kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGltZyBzcmM9"" alt="\">

解决办法:找着出现的类名,找着.m,如下图地方打钩即可。


2.
如果是新添加的第三方库,且不是静态库
先重复第一步过程,然后找到 Build settings->Linking->Other Linker Flags,如下图


将此属性修改成-all_load 或者 -ObjC ,这个视情况而定。总之可以多试几次。
3.如果添加的是第三方静态库(.a文件)

在用到这个库的所有文件中都出现了错误, 如上
HomeViewController.o
类和
AnalysisViewController.o
类
这种情况就可能是这个静态库路径混乱导致的链接错误
解决方法:Build settings->Search Path->Library Search Paths 添加静态库的相应路径。如下图


4.看看是不是有新添加的文件跟之前文件同名,这种情况也较为普遍。
5.错误信息中出现了某个类的名字,去原文件中看看#import了哪些第三方库,把这些库挨个注释排除,找到出错的那个库,然后按照官方提供的步骤重新添加一遍。
以上就是出现上述错误的一般解决办法,如果还解决不了,那就只有在另辟蹊径了。。
既然讲到了第三方静态库路径的混乱问题,那我下一讲就跟大家探讨下这个路径的问题,这也是常见的错误之一。
出现 linker command failed with exit code 1 (use -v to see invocation)错误。
在这个博客里有关于该错误的一些总结。但是还不全面。因为我现在出现的问题就没有在这篇博里找到答案。
看这个错误信息的描述:
duplicate symbol _titleBarHeight in:
/Users/RainGu/Library/Developer/Xcode/DerivedData/?-apdlzttrgstxamdqzjpryidhklxn/Build/Intermediates/?.build/Debug-iphonesimulator/?.build/Objects-normal/x86_64/UserRegisterViewController.o
/Users/RainGu/Library/Developer/Xcode/DerivedData/?-apdlzttrgstxamdqzjpryidhklxn/Build/Intermediates/?.build/Debug-iphonesimulator/?.build/Objects-normal/x86_64/CityView.o
从上面的信息看出,问题出在_titleBarHeight上面。搜索项目中的titleBarHeight。注意titleBarHeight前面的“_”没有了。因为titleBarHeight是一个变量,在源代码中是“titleBarHeight”,而在编译后,编译器会生成“_titleBarHeight”。
发现titleBarHeight是静态的,而我在类继承的时候,在子类中又声明了一次该变量。所以导致了错误。修改后正常。
问题是解决了,但是还不明白一个现象:在我修正这个错误之前,工程不能运行在模拟器上,但能运行在真机上。没搞明白!
这个问题的原因是 在 TARGETS --> Build Phases ---> Compile Sources 里面的某个.m文件多了一个或者少了一个
1、多了一个,就是有两个相同的.m文件存在,在报出的bug中,会告诉我们,这个时候我们删除一个就好了
2、少了一个,就是我们项目中.m 文件有 未添加进来的,

点击左下角的加号,然后把未添加的.m文件添加进来
|