A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

qq4116386

中级黑马

  • 黑马币:

  • 帖子:

  • 精华:

© qq4116386 中级黑马   /  2015-10-12 21:19  /  1580 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

(null): Linker command failed with exit code 1 (use -v to see invocation)

6 个回复

倒序浏览
顶起来
回复 使用道具 举报
顶一个
回复 使用道具 举报
自顶顶顶顶顶顶
回复 使用道具 举报
dddddddddd
回复 使用道具 举报
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文件添加进来


回复 使用道具 举报
DUKEMAN 中级黑马 2015-10-13 23:58:17
7#
还有可能是 在多文件中 多次引用了 全局变量, 需要用全局变量的时候,将它定义在 .m 文件 不要重复包含
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马