我所拥有的iOS模拟器目标的链接器报告以下警告:
ld: warning: too many personality routines for compact unwind to encode
没有给出行号,也没有任何可行的行号。谷歌搜索出现了一些Apple open source code,但我不是在研究它。
这是什么意思,我该怎么做才能解决它?
答案 0 :(得分:14)
我在C++ ABI for Itanium docs中找到了一些有关这意味着什么的信息。
个性例程是C ++(或其他语言)运行时库中的函数,它充当系统展开库和特定于语言的异常处理语义之间的接口。
外推,此警告表示您在同一个二进制文件中有太多种异常处理,并且其中至少有一个可能会失败。事实上,这正是观察到的in this question。
可悲的是,没有明确的方法来解决这个问题,只有解决方法。您可以禁止警告,删除代码,使用其他语言重写代码,禁用语言异常处理以及可能的其他语言。
答案 1 :(得分:5)
如果您遇到此警告的异常崩溃,即每::terminate()
次throw
调用,则解决方法是使用旧的矮人异常处理表。将以下标志添加到构建设置/链接/其他链接器标志:
-Wl,-keep_dwarf_unwind -Wl,-no_compact_unwind
答案 2 :(得分:2)
您可以尝试使用-Wl,-no_compact_unwind
为其他链接器标志设置静音警告。我认为这是无害的。
答案 3 :(得分:0)
当我的代码在设备上正常运行时,我尝试在iOS模拟器上运行时遇到了这个问题。就我而言,它不是警告,而是链接器错误。
幸运的是,我记得我为 luajit 添加了两个标记,以便在嵌入LuaJIT 部分下的instructions of this page后正确运行:
-pagezero_size 10000 -image_base 100000000
我的猜测是image_base地址只是主机CPU的界限。
无论如何,删除这些设置使其在我的配置中有效。
因此,请转到项目的设置,如果不相同,请查找此类硬连线值。
希望这有帮助,
中号