当我们在设置 Other Linker Flags -lstdc++时,我们到底在设置什么?

问题

    最近在玩儿 OCR ,使用了开源的 OCR 引擎 — TesseractOCR。编译遇到了如下问题:

这里写图片描述

    搜索到两个解决方案,测试之后都是奏效。一是在 Other Linker Flags 中新增标志 -lstdc++,二是在 Linked Framework and Libraries 中 add libstdc++.tbd.

原理

    这是个混编问题。TesseractOCR 库核心是 C++ 写的。在 Compile 阶段,一切顺利,CLang 会根据后缀(.m .cpp)选择编译器进行编译,产物都是 Object File(.o 文件)。如果一个文件调用另一个文件的方法,编译出的 Object File 中会出现 undefined symbol 去代表这个方法。在 link 阶段,Linker 通过把依赖的文件也加到最终的 executable 中 resolve undefined symbol。

    这里遇到的问题就是 Linker 没有主动的去 link stdc++ 库,解决方案 1 的解决思路是设置 Linker 标志,让 Linker 去 link stdc++ 库,解决方案 2 的解决思路是明确让Linker 去 link stdc++ 库,都是奏效的。

参考:Reference 1 Reference 2

猜你喜欢

转载自blog.csdn.net/fly1183989782/article/details/80558831