ios - 其他链接器标志 -ObjC 导致“找不到符号”错误
问题描述
我有一个像这样结构的纯Objective-C项目
- 链接到 App 目标和 Today 扩展目标的自定义静态库,用于共享/重用代码
- 静态库包含
AFNetworking
CocoaPods 安装的库(使用 use_frameworks!禁用) - iOS 今日扩展包含
Masonry
CocoaPods 安装的库(使用 use_frameworks!禁用)
在安装Masonry
到今天的扩展时,CocoaPods-ObjC
在我的今天的扩展目标中添加了 Other Linker Flag,这会导致Undefined symbol
编译扩展目标时出错。
但是,如果我删除-ObjC
标志,项目将成功编译,我不知道这是怎么发生的。我在互联网上搜索过,我唯一知道的是-ObjC
国旗会
使链接器加载定义了 Objective-C 类或类别的库中的每个目标文件
但我不知道为什么这种行为最终会导致编译错误。
这是我为重现该问题而创建的测试计划:https ://github.com/JohnnyTseng/SimpleProject
该项目现在将导致“未定义符号”编译错误,但如果您删除
${inherited}
-ObjC
的标志SimpleTodayExtension
,它将编译没有错误
尽管该项目在-ObjC
删除标志后编译良好,但我很好奇幕后发生了什么,如果有人能告诉我它是如何发生的,将不胜感激,谢谢!
解决方案
从clang
文档
-ObjC Treat source input files as Objective-C inputs -ObjC++ Treat source input files as Objective-C++ inputs
这是显式命令,如果它们不存在,编译器会隐式检测使用的语言,通常通过文件扩展名。因此,如果像往常一样遵循*.m、*.c、*.cpp,那么一切都很好,你实际观察到的是什么。
推荐阅读
- android - 为支付交易生成唯一订单 ID 的最佳方法?
- node.js - Express.js 文档中嵌套的[] 是什么意思?
- wordpress - 如何修复wordpress中的内存不足
- qml - 使用 QML 中的 obj 文件,3D 对象不显示原始颜色
- java - 在 JavaEE 中使用 @Inject 注解时出现 NullPointerException
- android - 如何在 Android Studio 中更改 Spinner-Array?
- javascript - 为什么 React Component 类和功能组件没有相同的行为?
- python - 为Python中列表中的每个值返回字典中的键
- ruby-on-rails - 将方法添加到只能在特定类中访问的类
- python - 如何使用 json 文件形成具有键值对的字典