swift項目引入OC混編
問題來源:
1.swift項目pods MJRefresh 為了在swift正常使用 建了一個橋接文件
2.在項目中又使用了 SDWebImage 用於加載網絡圖片
根據說明加了Podfile一個 use_frameworks!
編譯的時候問題來了
問題顯示類似這樣的錯誤:
failed to emit precompiled header '/Library/Developer/Xcode/DerivedData/MyprojectName-lajanjvhqjnfjksdsndsfkads/Build/Intermediates.noindex/PrecompiledHeaders/MyprojectName-Bridging-Header-swift_44AHJm3Z96qu-clang_2BIMGQVXGEZ09.pch' for bridging header '/Documents/MyProjectLocaiton/FoneApp-Bridging-Header.h'
問題解決方法:
了解了一下 use_frameworks! 下面是參考
https://www.jianshu.com/p/ac629a1cb8f5
//---------------------------------------------
靜態庫:
(靜態鏈接庫)(.a)在編譯時會將庫copy一份到目標程序中,
編譯完成之后,目標程序不依賴外部的庫,也可以運行 缺點是會使應用程序變大
動態庫:
(.dylib)編譯時只存儲了指向動態庫的引用。 可以多個程序指向這個庫,
在運行時才加載,
不會使體積變大, 但是運行時加載會損耗部分性能,並且依賴外部的環境,如果庫不存在或者版本不正確則無法運行
Framework:實際上是一種打包方式,將庫的二進制文件,頭文件和有關的資源文件打包到一起,方便管理和分發。
對於是否使用Framework,CocoaPods 通過use_frameworks來控制
1.不使用use_frameworks! -> static libraries 方式 -> 生成.a文件
在Podfile中如不加use_frameworks!,cocoapods會生成相應的 .a文件(靜態鏈接庫),
Link Binary With Libraries: libPods-**.a 包含了其他用pod導入有第三庫的.a文件
2.use_frameworks! -> dynamic frameworks 方式 -> 生成.framework文件
使用了use_frameworks!,cocoapods會生成對應的frameworks文件(包含了頭文件,二進制文件,資源文件等等)
Link Binary With Libraries:Pods_xxx.framework包含了其它用pod導入的第三方框架的.framework文件
1.純oc項目中 通過pod導入純oc項目, 一般都不使用frameworks
2.swift 項目中通過pod導入swift項目,必須要使用use_frameworks!,
在需要使用的到地方 import AFNetworking
3.swift 項目中通過pod導入OC項目
1) 使用use_frameworks,在橋接文件里加上#import "AFNetworking/AFNetworking.h"
2)不使用frameworks,橋接文件加上 #import "AFNetworking.h"
//---------------------------------------------
這里我發現swift 項目中通過pod
使用use_frameworks!
導入OC項目可以直接引用使用 或者放入橋接文件使用
OC項目引入swift混編
OC項目Cocoapods導入Swift庫出錯解決辦法
在開發過程中主要用的是OC語言,所以pod的都是OC庫,Podfile里又沒加use_frameworks!
所以一直都是.a類型的。后來因為需求需要用到一個只有swift版本的庫,就使用use_frameworks!將所有.a庫變成了.framework。然后信心滿滿地運行工程,結果GG。
最后歸納出幾個需要注意的點:
我是這樣操作的:
1、先Podfile里屏蔽所有pod的三方,終端執行 pod install
2、Podfile里加use_frameworks!,終端執行 pod install
3、找到Target->Build Settings->Other Linker Flags,把OC Pod進來的庫,刪掉
4、Podfile里取消屏蔽的所有pod的三方,添加要加入的swift的三方,終端執行 pod install
5、將用到的庫提示找不到的,從#import <xxx.h>改為#import "xxx.h";
6、搜索Swift Language Version,將版本設置為Swift庫能支持的最高版本