一、问题场景
在Xcode上运行腾讯云Demo或者开发者自己的项目,编译过程中有时会报错。最常见的是两种:
- 找不到SDK头文件(以下解决方法1)
- 链接错误报错信息显示
linker command failed with exit code 1 (use -v to see invocation)
。
二、解决方案
场景1
找不到SDK头文件。如下图所示,报错信息显示xxx file not found
一般就是该错误。
解决方法:
- 如果是运行腾讯云Demo,注意编译的target设置正确。比如下载的
TXLiteAVSDK_Professional.framework
,编译的target就是TXLiteAVDemo_Professional。 - 如果是开发者自己的工程,注意检查
Build Settings
->Search Paths
->User Header Search Paths
中添加头文件搜索路径是否正确。
场景2
缺少SDK需要的系统依赖库。如下图所示,报错信息显示undefined symbols
一般就是该错误。
解决方法:
参考文档添加所有需要加入的依赖库:https://cloud.tencent.com/document/product/454/7876#2.E3.80.81.E6.B7.BB.E5.8A.A0framework。
场景3
Xcode工程Other linker flags
设置错误。如下图所示,报错信息显示duplicate symbol
一般就是该错误。
解决方法:
Other linker flags
需要设置成-ObjC
,不能有-all_load
和-force_load
。
场景4
Xcode工程编译SDK报 duplicate symbols 错误,冲突的符合为bcm.o和rsa.o。
解决方法:
Xcode工程配置 Build Settings 下 Dead Code Stripping
需要设置成YES。
场景5
Xcode工程 bitcode 设置错误。如下图所示,报错信息显示dose not contain bitcode
一般就是该错误。
解决方法:
注意iOS端 TXLiteAVSDK 精简版之外,其它版本都是不支持bitcode的,需要设置为NO
才能成功运行和打包。
三、原理解释
iOS开发目前的常用语言是Objective C
和Swift
,二者的编译都是依赖于Clang + LLVM
。简单来说编译的过程如下:
编译器配置->标准库与头文件确认->确定依赖关系->头文件的预编译->预处理->生成中间代码->生成汇编代码->生成机器码->链接->成可执行文件
所以如果遇到找不到头文件,缺少依赖库,重复定义了类和方法,或是编译器配置不当等情况下,都会产生编译报错。
四、参考资料
- 编译详细过程及原理参考:https://blog.csdn.net/Hello_Hwc/article/details/53557308
- 编译器的工作过程:http://www.ruanyifeng.com/blog/2014/11/compiler.html
- other linker flags参数的作用参考:https://blog.csdn.net/iosfengguibin/article/details/52086435