编程技术记录

世界你好!

iOS开发环境下,构建动态库时可能会出现undefined symbols,某些情况下我们选择让链接器(ld)忽略这些错误

# 传给 ld特定 Wl参数,来忽略undefined symbols
-Wl,-U ,符号A, -U ,符号B, -U, 符号C ...
#或者使用 Xlinker
-Xlinker -U -Xlinker 符号A,-Xlinker -U -Xlinker 符号B,-Xlinker -U -Xlinker 符号C...

上面的参数告诉链接器(ld),未定义的符号在其他地方实现了。

然后,当我们在hostApp环境中加载这个动态库时,可以正常加载,但是运行到某些场景时,会因为missing symbol called崩溃。

崩溃的原因是上面忽略的undefined symbols没有被加载。

而undefined symbols没有被加载的原因是链接器(ld)会只想Dead Code Strips这个动作,因为我们在构建动态库时选择了忽略undefined symbols,就有可能(不是一定)导致这些undefined symbols变成Dead Code而被移除掉。

为解决这个问题,我们还需要像链接器(ld)传递一些参数,强制这些在其他地方实现的undefined symbols被链接到hostApp环境中

# 注意和上面提到的参数区别,-u和-U,小写的u表示强制加载,大小的U表示忽略
# 传给 ld特定 Wl参数,来强制链接undefined symbols
-Wl,-u ,符号A, -u, 符号B, -u, 符号C ...
#或者使用 Xlinker
-Xlinker -u -Xlinker 符号A,-Xlinker -u -Xlinker 符号B,-Xlinker -u -Xlinker 符号C...

另外,需要注意的是,上面提到的参数,忽略undefined symbols参数是在构建动态库过程中使用;强制链接undefined symbols参数是在构建hostApp时使用。

发表回复

© Beli. All Rights Reserved.