解决Pod更新友盟相关库后出现的问题

前言:

我在我的项目里面通过pod更新后出现了一些莫名其妙的问题,比如:

(1)Invalid bitcode signature

(2)linker command failed with exit code 1 (use -v to see invocation)

(3)_OBJC_CLASS_$_MobClick", referenced from:

(4)

解决Pod更新友盟相关库后出现的问题_第1张图片

等等

第一部分(首先把试错记录写出来)(耐心看,结论在后面):

1、#import

引入这个文件也报错,提示这个文件没有找到,改为,冒号也不行。

2、删掉文件$(PROJECT_DIR)/appName/3rdPartyLibs/NeteaseLib/NIMSDK_LITE/NIMSDK后,#import 这个也有问题了,因为删除了路径,相当于,堵住了路找不到了。

3、解决路程。

$(PROJECT_DIR)/appName/Pods/UMCCommon/UMCommon.framework

往project里面添加了$(PROJECT_DIR)/appName/Pods/UMCCommon/UMCommon.framework

还是不行

改为

$(PROJECT_DIR)/appName/Pods/UMCCommon/UMCommon.framework/Headers不行

$(PROJECT_DIR)/appName/Pods/UMCCommon/UMCommon.framework不行

$(PROJECT_DIR)/appName/Pods/UMCCommon也不行

clean 不行

clean options也不行

# Uncomment the next line to define a global platform for your project

# platform :ios, '9.0'

target 'appName' do

  use_frameworks!

  pod 'UMCCommon'

  pod 'UMCSecurityPlugins'

  pod 'UMCAnalytics'

end

改为

# Uncomment the next line to define a global platform for your project

platform :ios, '9.0'

target 'appName' do

  pod 'UMCCommon'

  pod 'UMCSecurityPlugins'

  pod 'UMCAnalytics'

end

后面运行又报错,又不行

现象:所有文件都编译完了,到了最后除了问题

https://www.cnblogs.com/tinych/p/6542985.html

解决Pod更新友盟相关库后出现的问题_第2张图片

这两处都试了,不行

解决Pod更新友盟相关库后出现的问题_第3张图片

5、将pod重新删掉,在重新install 不行。

6、把pod文件取出来,放到外面的目录里面,不行。

7、写了一个demo是没问题的。这一条证明库本身是没问题的。

8、去掉一些库也不行。

9、我根据安装pod update提示,在Frameworks里面增加了一个$(inherited)问题就没有了,但是隔一天问题又出现了。

10、ONLY_ACTIVE_ARCH

以及上面Frameworks path 都设置了不行。

11、reset到可行的commit,没有pod update前,不行。

12、什么都没变,刚开始不能run,我通过clean和comand + shift后,不行。

13、降低xcode由 9.4.1 为 9.2也不行  这一步也很关键,排除了低版本的问题

14、将build active architecture Only 改为yes后问题解决,在xcode v9.4.1能跑,在v9.2上也是能跑的。这个选项是什么意思呢,(这个属性设置为yes,是为了debug的时候编译速度更快,它只编译当前的architecture版本。

而设置为no时,会编译所有的版本。这是一个重要的设置

这个是设备对应的architecture:

armv6:iPhone 2G/3G,iPod 1G/2G

armv7:iPhone 3GS/4/4s,iPod 3G/4G,iPad 1G/2G/3G

armv7s:iPhone5, iPod5

编译出的版本是向下兼容的,比如你设置此值为yes,用iphone4编译出来的是armv7版本的,iphone5也可以运行,但是armv6的设备就不能运行。

所以,一般debug的时候可以选择设置为yes,release的时候要改为no,以适应不同设备。

参考:http://www.cocoachina.com/bbs/read.php?tid=244345

15、疑问,build文件的时候,有的会有1200个文件,但有的时候只有600多个文件,这是为什么呢。

我将build active architecture Only设为NO,run的文件就会多了600个。可见设置为不仅当前的architecture,就会考虑很多的architecture,编译文件就会增加很多。

16、我把Framework Search Paths处 的$(inherited),去掉,就会报

 linker command failed with exit code 1 (use -v to see invocation)这个错误,可见缺乏$(inherited)能引起这个错误。

$(inherited)这个肯定是引起问题的一个因素,但根据下面的调试,不是唯一因素。这是一个重要的结论

17、然后我把build active architecture Only的debug和release 都设置为NO , 会报

(1) Invalid bitcode signature

(2) linker command failed with exit code 1 (use -v to see invocation)

两个错误

由此可见linker command failed with exit code 1 (use -v to see invocation)错误的原因是多层次的,这也是一个重要结论

18、回到最初出问题的地方(就是引入库后,应用库代码之前),我发现

build Active Architecture Only设置的是,debug是YES,realease是NO,是正确的,加了一句执行代码,重新跑,错误又出来了。不过包的错误是:

(1)_OBJC_CLASS_$_MobClick", referenced from:

(2)linker command failed with exit code 1 (use -v to see invocation) 这个可以推出:Invalid bitcode signature问题主要是与build active architecture Only设置有关

19、打开目录,发现Framework Search Paths里面缺乏$(inherited),其他的Header Search Paths 以及LIbrary Search Paths里面是有$(inherited)的,重新跑,不行,报错:

(1)_OBJC_CLASS_$_MobClick", referenced from:

(2)linker command failed with exit code 1 (use -v to see invocation)

把pod 更新后,也不行

将Project 里面的Enable Bitcode改为No也不行

,都改为YES也不行,都报错误:

(1)_OBJC_CLASS_$_MobClick", referenced from:

(2)linker command failed with exit code 1 (use -v to see invocation)

20、回到正确的commit,重新pod update,重新跑是没问题的。

21、在Other Linker Flags 的debug环境下增加$(inherited),报错减少一个,现为:

(1)linker command failed with exit code 1 (use -v to see invocation)

22、GCC_PREPROCESSOR_DEFINITIONS release 里面增加$(inherited)问题存在:

(1)linker command failed with exit code 1 (use -v to see invocation)

23、在Other Linker Flags 的debug环境下增加$(inherited),报错减少一个,现为:

(1)linker command failed with exit code 1 (use -v to see invocation)

由此可见,问题不完全与pod 的警告有关

24、错误分支合并replaceUmeng后,修改冲突后,重新run ,有问题,看来error分支的修改把之前的冲掉了。

25、切换到正确的分支后,run有问题,我做了退出软件的操作,重新进来,就好了。

26、对的分支拷贝出来的分支重新run 是没有问题的

27、有问题的分支,添加$(inherited并删除一些库后,在没问题的分支运行完毕后,重新运行有问题的分支,结果过了。

28、删掉pod重来,出来重复文件问题,删掉dived file ,删掉了一个红色的.a文件,clean 和clean shift n

 

第二部分(结论):

29、库文件放3rdParies后,#import 不会报错

但是如果放3rdParie子目录,#import 会报错,这是问什么

现在试了一下,发现问题有没有了。但前提要把UTDID去掉,这是核心问题,这是引起error的另一个重要原因,第一个是$(inherited)

30、有的时候有重复文件,可是我们去搜,就看看不到,但是确实存在,原因是有可能相同的库包含在另一个封装的库里面去了。

31、最后发现问题所在:

原来UMenng里面的一个库和支付宝里面的一个库相同。这个库叫UTDID这个。

32、为什么会出现这样的情况,我们缺乏对库的深层次管理,导致库出现重复。

 

第三部分(其他分析):

33、The file couldn't be opened because you don't have permission to view it

这个可以通过comand + clean 来解决

34、我pod 了UTDID文件,但是我重新删除了它,跑的时候不能进行了,出现错误,我根据

Ld/Users/secoo/Library/Developer/Xcode/DerivedData/appName-cbqfutmdvsdhaifgfxneokbkryzm/Build/Products/Debug-iphoneos/appName.app/ normal

这个提示,知道可能是DerivedData里面的的问题,我删掉了它,重新跑问题仍在,只有通过搜索删除-framework "UTDID”和 -framework “UMCSecurityPlugins”才解决问题。删掉库不能简简单单的进行。

35、#import

凡是以这种格式的,我们都可以用#import 这种形式,不管是pod还是放到外面

36、删掉pod ,除了删掉目录里面pod相关的文件外,还要删掉build phases里面与pod相关的一个目录。

37、Frameworks Search Paths ,Header Search Paths, Library Search Paths的区别(部分来自网络)

(0)Header Search Paths和User Header Search Paths 的区别:

通过 #import 引入头文件的方式有 <> 和 ""。<> 是只从 Header Search Paths 中搜索, 而 "" 则能从  Header Search Paths 和 User Header Search Paths 中搜索。换言之 ,假如你把 路径加到  User Header Search Paths 中,用 #import  的方式去引入对应的头文件,就会报错。 如果用 Header Search Paths就没有问题了(准确性不知,来源网络)

(1)Framework Search Paths 管理导入的*.framework的路径

(2)Library Search paths 管理导入的*.a的路径

(3)Heeder Search Paths管理导入的头文件的路径

(4)、${PODS_ROOT} 

$(SRCROOT)代表的时项目根目录下

$(PROJECT_DIR)代表的时整个项目

Xcode在编译时, Library / Header Search Paths是一定会去搜索的。而User Header Search Paths只有在Always Search User Paths为Yes时才会被搜索。

(5)、Project的Building Settings中得设置默认并不被Targets继承,只有当Targets的设置加入了$(inherited)时才被继承,添加目录的时候写上“$(inherited)” 就表示从frameworks里面读取。

(6)、$(SRCROOT) 

(7)Project的Building Settings中得设置默认并不被Targets继承,只有当Targets的设置加入了$(inherited)时才被继承,添加目录的时候写上“$(inherited)” 就表示从frameworks里面读取。

一种很常见的情况, 我建一个工程运行正常,但是把工程发给别人就会出现这个错误,这也是XcodeSearch Path的相对路径和绝对路径导致的。

所以在修改Library / Header Search Paths这个选项的时候使用:  "$(SRCROOT)/当前工程名字/需要包含头文件所在文件夹"

将上面的双引号里面的字符串拷贝之后,你会发现这个“$(SRCROOT)”,会自动变成当前工程所以的目录。这样就可以了,发给别人,别人也不用在去修改路径了。

参考文章一(很棒的文章,作者写的很细致):

https://blog.csdn.net/bobbob32/article/details/77008701

参考文章二:

https://www.jianshu.com/p/cb1973a78650

 

你可能感兴趣的:(iOS,开发)