一个苹果

导入第三方库编译错误总结

2018-09-13  本文已影响0人  _小沫

项目最新版本引入了VR拍照相关静态库,编译时遇到一些错误,现做下总结:

  1. 将静态库拖入项目后,编译报错:
    xxx.h file not found

这个是比较常见的错误,一般这个错误可以在Build Settings中设置Framework Search Paths解决。但我检查了项目中相关的设置,确认都是正常的,后来发现是我在将静态库拖入项目中时忽略了一点:
往项目中加文件时,会有以下选项:

选项

Destination和Add to targets选项基本都是可以确定的;Added folders的两个选项有什么区别呢?

将报错的库删除,然后重新导入选择Create groups后编译通过。

  1. 相关功能需要使用opencv,在加入opencv2.framework后,编译报错:
    duplicate symbols
duplicate symbols

后来发现项目中Build Settings中Other Linker Flags加了-all_load, 然后使用-force_load替换-all_load编译通过。
常用的3个flag:-all_load,-force_load,-ObjC,区别如下:

  1. 由于引入相关静态库后,某些地方需要使用C++。在混编时编译报错:
    file not found
file not found

因为要支持C++编译,我将Complie Sources As设置为Objective-C++:

Objective-C++

再度编译,OC的运行时方法全报错:

11

最后的解决方法还是将Complie Sources As设置为According to File Type;看字面意思就能理解,这个选项是根据文件类型选择编译类型。因此将引用了C++文件的.m文件后缀改为.mm即可兼容OC和C++。一般引用C++文件地方很多,如果将这些文件都改为.mm后缀也是比较麻烦。所以这时需要封装一个OC类,这个类专门处理有关C++的事情。其他文件只要引用这个OC类即可(这个类引用C++头文件时一定要在.m文件中引用,如果在.h文件中引用,所有引用了这个OC类的文件同样还是会报file not found错误。)

  1. 切换至模拟器编译报错:
    undefined symbols
undefined symbols

后来查看了下该静态库支持的架构,发现没有支持x86_64架构,联系静态库的开发者重新打包后就可以了。
查看静态库支持的架构方法如下:
终端命令cd到库所在路径,然后执行lipo -info命令,就能看到支持的架构了。

lipo
上一篇下一篇

猜你喜欢

热点阅读