use_frameworks!遇到了library not found for -lXXXXX 的解决方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了use_frameworks!遇到了library not found for -lXXXXX 的解决方法相关的知识,希望对你有一定的参考价值。

参考技术A 最近项目要添加新功能了,真是懒的写,可是既然要写,就要从中学到点新东西。Swift已经发布了两年了,我居然还没用过,太不应该了。

项目开动啦,还是用cocoapods引入几个swift库先。一上来就遇到问题!

Screen Shot 2016-09-17 at 6.21.59 PM.png

没问题,太好解决的了,cocoapods的提示都已经说明了解决办法,在podfile里直接加上use_frameworks!就行了

Screen Shot 2016-09-17 at 6.29.41 PM.png

为什么使用swift库要加这句呢,原来Apple不允许build包含swift静态库了。而cocoapods使用了frameworks方式来集成swift库,就是use_frameworks!这句话了。

参考: http://blog.cocoapods.org/CocoaPods-0.36/

好了,应该没什么问题了吧,command+B,编译一下试试。

Screen Shot 2016-09-17 at 5.43.02 PM.png

这个linker error太常见了,开始以为一下就能搞定了,没想到弄了好几天,汗!明显是链接器没有找到AFNetworking的这个库嘛。看到一般解决这个问题是三种方法

第一种:点击 XCode 工程文件,在 Build Phases 中查看 “ Link binary With Libraries”,奇怪并没有链接AFNetworking。(一般应该能发现有一到数个的条目是用红色字体来显示的,这样才导致链接不到,应该是Pods的target集合所有库生成一个pod.a或者pod.framework)

Screen Shot 2016-09-17 at 7.02.16 PM.png

第二种:在工程的 Target 中选中要执行编译的target,然后 “get info”,打开 Build Settings页面,在 “ Library Search Path” 中添加缺失链接库的所在文件夹的路径。(这个因为是cocoapods管理的所需的库,一般到是没什么问题,是由$(inherited)搞定的,这个后面会讲到)

第三种:关闭XCode,再用pod install 命令重新安装,成功后再打开XCode编译项目。对我来说试了好多次都不行,完全是死马当活马医啦!

这样搞了好几天,还是不行。于是深刻感觉到cocoapods使用起来是真方便,可是一但出问题,而且不太常见的话,就会被迫要懂一点XCode build的过程了。只能继续分析error message了,经常看见use -v to see invocation,这个命令行参数-v该怎么加,我还是不懂,要是有人知道,千万要告诉我,谢谢啦!还是看下build error先啦。

Screen Shot 2016-09-17 at 7.24.29 PM.png

看了好久终于发现点蛛丝马迹。“-ObjC -lAFNetworking -lARGenericTableViewController -lFLKAutoLayout -lFTPopOverMenu -lFontAwesome -lFontAwesomeIconFactory -lJLRoutes -lMBProgressHUD -lMantle -lMasonry -lObjectiveSugar -lSDWebImage -lSLExpandableTableView -lUIAlertView+Blocks -lUICKeyChainStore -lUITextView+Placeholder”。怎么会这样,不是说用frameworks替代了静态库了吗,看来问题出在这里了,编译的时候XCode还是想去链接AFNetworking的静态库。一直就觉得是use_frameworks导致的,就去查看cocoapods生成的.xcconfig文件。

Screen Shot 2016-09-17 at 5.23.13 PM.png

仔细看发现其中并没有-lAFNetworking这样的一个LDFLAGS,在stackoverflow上找了好久才偶然发现问题出在Build Settings里Other Linker Flags

Screen Shot 2016-09-17 at 10.10.57 PM.png

Screen Shot 2016-09-17 at 10.12.59 PM.png

原来项目从纯OC过来的,从前cocoapods生成的一些-l"AFNetworking"之类的flags还在,问题就在这里了,其实解决方法直接删掉,留下$(inherited)就行了,那删掉了XCode还知道怎么链接吗,其实是知道的,关键就在inherited上,原来xcode的这些config项存在继承链。Resolved <- Target <- xcconfig <- Project <- ios Default。顺序是从右到左,cocoapods生成的xcconfig文件优先级高于在target里的设置。

困扰了好几天,感觉cocoapods虽然帮助我们很多,我们不用像写makefile那样麻烦,可是好像失去了好多对项目的掌控力,还是要懂一点编译过程比较好。

还是学到了好多东西,光从库方面讲,发现到XCode链接需要经过好几个阶段,首先要找到库的头文件路径,在build settings里的Header Search        Paths设置

Screen Shot 2016-09-17 at 9.35.39 PM.png

然后去找library的位置,在build settings里的Library Search Paths设置

Screen Shot 2016-09-17 at 9.21.00 PM.png

如果编译出错的话build phases的link binary with library里的Pods项目就会出现红字(不过好像使用了framework之后,Pods的framework还是照常生成,因为是动态链接,记得静态链接的时候生成的.a文件的确是红色的)

Screen Shot 2016-09-17 at 7.02.16 PM.png

最后XCode要链接哪些库是在Other Linker Flags里设置的

Screen Shot 2016-09-17 at 10.12.59 PM.png

同时这些设置cocoapods又把这些设置集中在类似父类的xcconfig文件中

Screen Shot 2016-09-17 at 9.30.46 PM.png

好了,写的好长,其实没什么内容,不过我花了这么长时间搞定的,不写长点不甘心呐。

文/NSWhoohoo(作者)

原文链接:http://www.jianshu.com/p/d0dc92d9a31b

还有可能是Build Phases 里的Link Binary With Libraries 里面的pods文件有两个删掉其中一个就好了 

注:以下两张图片文件需一致

Podfile 中的 use_frameworks 问题

【中文标题】Podfile 中的 use_frameworks 问题【英文标题】:Issues with use_frameworks in Podfile 【发布时间】:2016-03-15 06:43:59 【问题描述】:

我目前在集成特定的 cocoapod 时遇到问题,想知道是否可以获得一些帮助/见解。我正在尝试集成 JSQMessages pod,可在此处找到:https://github.com/jessesquires/JSQMessagesViewController。

当我将 pod 添加到我的 Podfile 并运行 pod install 时,我无法按需要导入项目。它不认识它。我发现这是因为我需要 use_frameworks!我的 Podfile 中的行。但是,当我添加该行时,我的项目会中断,因为我也通过 cocoapods 使用 Google Maps 和 Braintree API,而这些与 use_frameworks 行中断。我过去在使用其他 pod 时遇到过这个问题,但能够通过手动导入来修复它们。这似乎并不那么简单。我有几个问题

查看 pod,是否可以手动导入 JSQMessages pod? 是否还有一种方法可以将_frameworks 用于某些 pod 而不是其他 pod,因为这也可以解决问题?

我的问题的任何其他解决方案也会有很大帮助!请尽快通知我!

【问题讨论】:

我也遇到了你的问题,如果你使用use_frameworks!,可以查看***.com/questions/34046676/… 第二个问题的答案是,使用use_frameworks是选择yes or no,不能部分使用。 我想我的最终目标是不使用 use_frameworks!。当我尝试在不使用该行的情况下手动导入时,无法识别 pod 有些仓库只是支持框架,如果你想使用它,你必须将它构建到框架中。 【参考方案1】:

我添加了两个

 pod 'GoogleMaps'
 pod 'Braintree'

我赢得的项目安装了pod 'JSQMessagesViewController' 并且构建良好。所以这就是我认为你的问题可能。

问题的根源不在于 podfile 中的 use_frameworks! 行 问题是您使用的是 PROJECTNAME.xcodeproj,但是当您运行 pod install 命令时使用 pod,这会创建一个新的 PROJECTNAME.xcworkspace

关闭您的项目并打开您在终端的项目根目录中运行 pod install 后创建的新 PROJECTNAME.workspace。

如果您还有其他问题,请告诉我?

【讨论】:

不,我一直在使用 .xcworkspace。您认为使用 use_frameworks 使用 pod install 重新创建我的工作区是否有益!行。

以上是关于use_frameworks!遇到了library not found for -lXXXXX 的解决方法的主要内容,如果未能解决你的问题,请参考以下文章

创建一个可可足类

Podfile 中的 use_frameworks 问题

Swift 桥接头文件不适用于 use_frameworks

为啥我们使用 use_frameworks!在 CocoaPods 中?

没有 use_frameworks 就无法安装 Swift cocoapod!找不到模块 swift.h 文件

iOS遇到的问题:OC与swift混编造成的 Failed to emit precompiled header