ios: Undefined symbols

ios: Undefined symbols

ios universal build

2019.4.30

背景

用xcode 做了一个iphone ui demo工程,它依赖另一个 tvm_model.framework 工程.

demo内使用了 tvm_model.framework内的c++类 TVMModel.

问题

编译demo工程,Debug能编译通过,Release总是报告错误:
Undefined symbols for architecture arm64/armv7:
OBJC_CLASS$_TVMModel”, referenced from: objc-class-ref in AppDelegate.o

调查过程

在xcode tvm_model工程设置内,对比了Debug和Release区别,感觉有3个选项和编译有关:

OptionsDebugRelease
GCC_GENERATE_DEBUGGING_SYMBOLSYESNO
GCC_OPTIMIZATION_LEVEL0s
GCC_SYMBOLS_PRIVATE_EXTERNNOYES
Build Active Architecture OnlyYESNO

把Release的4个配置项,挨个修改尝试,发现GCC_SYMBOLS_PRIVATE_EXTERN从YES改成NO,demo就能编译成功.
把Build Active Architecture Only从NO改成YES也能成功。

分析

定位到原因,上网搜索了一下,GCC_SYMBOLS_PRIVATE_EXTERN对应的是:
Build settings 内的 Symbols Hidden By Default.

从字面意思看,是把符号隐藏起来(能让编译结果缩小很多).

Release模式,所有符号被隐藏起来了,那么demo就连接不到tvm_model内的类了.

解决办法

只要把需要导出的类,明确的告诉编译器就行了。

具体参见这个链接制作framework

还有一个问题,就是demo连接的device是i386的模拟器,而tvm_model.framework只编译了armv7/armv8平台的代码。

必须把tvm_model工程的Build Active Architecture Only,设置成YES,这样才能和demo一样,编译出模拟器需要的i386代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值