前言:
我在我的项目里面通过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)
等等
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
这两处都试了,不行
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
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
(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