iOS - building for iOS-arm64 but attempting to link with file built 报错问题的解决

开发中因为其很多的功能复杂且重复、又或者不希望比人看到自己写的代码保护知识产权等等,所以我们将这个功能封住起来供我们来调用,所以现在基本上每一个项目中都会用到各种各样的库,方便的同时也带来了一些麻烦,,,

一、关于 “库” 的介绍

  1. 我们平时在项目中用的最多的就是开源的第三方库,这种库是开源的,我们不仅能用,还能查看源代码甚至可以修改源代码。
    与开源库对应的就是闭源,闭源库分为动态库静态库动态库就是.dylib或者.framework结尾的文件。就是苹果官方提供给我们用的那些库。开发者不能在项目中使用自制的动态库,否则无法上传到APPStore。(文字复制,未做验证)所以,对于闭源库,我们主要讨论的是静态库。静态库的样子就是用户拿到的文件有很多头文件.h+资源包+编译过的一个二进制文件.a(.framework)。即没有公开的那些文件都被编译进了.a或.framework里面。如果是为了保护知识产权什么的可以用静态库。

  2. .a静态库需要结合.h文件和资源包给用户使用。而生成.framework的话里面已经包含.h和资源文件,可直接给用户使用。

  3. 如果库涉及图片等资源,可以用放在与.a或.framework同名的bundle文件中。新建文件,修改后缀为bundle即可。

  4. 静态库多次被使用就会多次被拷贝,产生冗余,但是没办法,我们不能使用自制的动态库(不重复拷贝)。

二、项目中引用静态库(. framework)报错

我在项目中引用了一个第三方的framework,当在模拟器编译的时候没有问题,但如果在真机的环境下就会报下图的错误,如图所示:

what fuck?? 生活又对我这个小白下了毒手??
经过一系列的整之后,发现 报错的这个 SDCalertView. framework 文件下有两个文件夹,如图:

首先不要被名字搞混淆,这两个分别对应的是 真机环境 和 模拟器环境下编译的文件。如图:

所以我解决的办法就是: 如果是需要真机运行,那么将项目中原来的SDCalertView. framework 删除,然后add file release 下的 SDCalertView. framework,反之也是一个道理。
然后每次重新 add 之后 记得修改 对应 framework 的 embed 如图:

然后 运行就正常了 success !!!(下面有一劳永逸的方法⬇️)

三、为什么这么修改就可以了?

可以看到 上面报警告的那张图,黄色部分有一句提示:building for iOS-arm64 but attempting to link with file built ,导致的意思是想在真机的arm64环境下编译,但是却链接到了 模拟器的X86_64架构的文件了。真的是这样吗?

查看了整个文件看到如下两张图:分别对应真机 和 模拟器


真机 对应的文件夹
模拟器 对应的文件夹

找到 那个白色 的 SDCAlertView


截屏2020-04-17 下午6.27.51.png

然后 输入 lipo -info SDCAlertView 的路径

可以看到 这个 文件是 x86_64 的 也就是对应的是 模拟器的版本

再看看 另一个:可以看到 对应的是 真机下的。

所以,这也就是我们每次都要切换文件夹的原因。。。。。有点傻。。

四、一劳永逸的办法

可不可以不需要我们自己去切换呢?
答案是有的。。。

我们可以将两个给合并起来,得到一个 x86_64 armv7 arm64 版本的。
操作如下:

lipo -create 真机路径 模拟器路径 -output 真机路径

这里的真机路径和 模拟器路径 对应的是 那个白色的 SDCAlertView 的路径


这样将 真机路径 的文件拖入工程中,就可以了。完美解决~.~

4月22日更新 打包出错

今天打包测试包报错:

参照了网上的做法解决了:https://www.jianshu.com/p/0145916f2139
所以绕了一大圈,还是不能一劳永逸的解决问题,每次切换模拟器和真机的时候就得切换 静态库包。。(不知道有没有哪位大神解决了这个问题,希望可以在下面评论区说出解决的方法,谢谢)

各种架构解释:

模拟器32位处理器测试需要i386架构,(iphone5,iphone5s以下的模拟器)
模拟器64位处理器测试需要x86_64架构,(iphone6以上的模拟器)
真机32位处理器需要armv7,或者armv7s架构,(iphone4真机/armv7, ipnone5,iphone5s真机/armv7s)
真机64位处理器需要arm64架构,(iphone6,iphone6p以上的真机)

大致的问题解决思路就是这么多。欢迎补充和改正~~~
参考文档:
https://www.jianshu.com/p/840badb8a861
https://blog.csdn.net/weisubao/article/details/43270927
https://blog.csdn.net/u013531215/article/details/79359378

关于 库 的介绍:
https://www.jianshu.com/p/42891fb90304

你可能感兴趣的:(iOS - building for iOS-arm64 but attempting to link with file built 报错问题的解决)