如何为 arm64 构建 zlib
Posted
技术标签:
【中文标题】如何为 arm64 构建 zlib【英文标题】:How to build zlib for arm64 【发布时间】:2014-04-09 05:44:16 【问题描述】:我使用依赖于 zlib 的开源渲染库 (Ogre3D)。
在 XCode5 中,我注意到在为 ios 构建时,如果 ARCHS 设置指示 64 位(arm64)架构,zlib 将不会构建。
我收到与 LSEEK
宏、read
和 write
函数相关的“隐式函数声明”错误。我在 gzlib.c 中查找了LSEEK
:
#if defined(_WIN32) && !defined(__BORLANDC__)
# define LSEEK _lseeki64
#else
#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0
# define LSEEK lseek64
#else
# define LSEEK lseek
#endif
#endif
我的猜测是这里有问题,但我不知道是什么。至于read()
和write()
我不知道。
【问题讨论】:
我们正在使用官方的 zlib 库(截至昨天的版本为 1.2.8),但我们有一个修改过的CMakeList.txt
文件,其中很多内容都被删除了。也许将我们的与官方 zlib 库中的进行比较,以检查是否有一些必须添加的东西才能在 arm64 上编译。
“我们”是指 Ogre3D,对吧?我没有意识到使用了自定义版本。
是的,我所说的“我们”是指 Ogre3D(或者更具体地说,是我所属的 Ogre3D 开发团队)。应该更清楚,对不起。再说一遍:源码是正式版,只是CMakeList.txt不同。
另外:您是否尝试手动定义_LARGEFILE64_SOURCE
并设置_LFS64_LARGEFILE-0
以检查使用lseek64
是否可以解决问题?
【参考方案1】:
尝试在 gzguts.h 中添加#include <unistd.h>
。
【讨论】:
解决了我的问题。谢谢。 如果您在为 OpenCV3.1.0 编译 zlib 时遇到问题,也可以使用。谢谢。【参考方案2】:在这种情况下,最简单的解决方案是根本不自己构建 zlib,因为它已经预编译了 iOS SDK(也适用于 arm64)。
latest commit 也在官方 Ogre 依赖库中修复了它。
除此之外,this Ogre3D thread 还有这个选项:
使用 ARCHS = ARCHS_STANDARD_INCLUDING_64_BIT,像 zlip 这样的项目失败了。当我将其更改为 ARCHS_STANDARD_32_64_BIT 时,他们构建成功。我发现前者评估为“armv7 armv7s arm64”,而后者目前评估为“armv7 armv7s”。所以我认为 zlip 不会为 arm64 构建。
这意味着 Ogre3D 部件被编译为 64 位,而像 zlib 等一些依赖项则保持 32 位。
【讨论】:
我认为这只是描述了同样的问题......它不适用于 arm64。虽然不为 arm64 构建是一种选择,但 32 位应用程序会在 64 位 iOS 上引入额外开销,而且这似乎不是一个长期解决方案! 我明白并同意。那就看看这个答案吧。也许添加#include <unistd.h>
可以解决问题:***.com/a/20143790/1947205以上是关于如何为 arm64 构建 zlib的主要内容,如果未能解决你的问题,请参考以下文章