【问题标题】:Android NDK - fatal error: zlib.h: No such file or directoryAndroid NDK - 致命错误:zlib.h:没有这样的文件或目录
【发布时间】:2014-06-04 15:46:25
【问题描述】:

我无法包含 Android NDK 原生库 zlib 标头 zlib.h:我收到*致命错误:

zlib.h:没有这样的文件或目录

运行mka hello_world时。

我正在使用 CyanogenMod mka build 命令进行编译(这是 Android NDK)。

Android.mk文件:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS) 
LOCAL_SRC_FILES := test.c
LOCAL_MODULE      := hello_world  
LOCAL_LDLIBS      := -lz
include $(BUILD_EXECUTABLE)

test.c(此处不需要 zlib,但这是示例):

#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <zlib.h>
int main()
{
     printf("Hello World\n");
     return 0;
}

调试信息-完整命令(mka showcommands):

prebuilts/misc/linux-x86/ccache/ccache prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin/arm-linux-androideabi-gcc -I external/test -I /home/me/cm/out/target/product/galaxysmtd/obj/EXECUTABLES/hello_world_intermediates -I libnativehelper/include/nativehelper  -isystem system/core/include -isystem hardware/libhardware/include -isystem hardware/libhardware_legacy/include -isystem hardware/ril/include -isystem libnativehelper/include -isystem frameworks/native/include -isystem frameworks/native/opengl/include -isystem frameworks/av/include -isystem frameworks/base/include -isystem external/skia/include -isystem /home/me/cm/out/target/product/galaxysmtd/obj/include -isystem bionic/libc/arch-arm/include -isystem bionic/libc/include -isystem bionic/libstdc++/include -isystem bionic/libc/kernel/common -isystem bionic/libc/kernel/arch-arm -isystem bionic/libm/include -isystem bionic/libm/include/arm -isystem bionic/libthread_db/include -c  -fno-exceptions -Wno-multichar -msoft-float -fpic -fPIE -ffunction-sections -fdata-sections -funwind-tables -fstack-protector -Wa,--noexecstack -Werror=format-security -D_FORTIFY_SOURCE=2 -fno-short-enums -mcpu=cortex-a8 -mfloat-abi=softfp -mfpu=neon -include build/core/combo/include/arch/linux-arm/AndroidConfig.h -I build/core/combo/include/arch/linux-arm/ -Wno-unused-but-set-variable -fno-builtin-sin -fno-strict-volatile-bitfields -Wno-psabi -mthumb-interwork -DANDROID -fmessage-length=0 -W -Wall -Wno-unused -Winit-self -Wpointer-arith -DNEEDS_VECTORIMPL_SYMBOLS -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -DNDEBUG -g -Wstrict-aliasing=2 -fgcse-after-reload -frerun-cse-after-loop -frename-registers -DNDEBUG -UDEBUG -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing       -MD -MF /home/me/cm/out/target/product/galaxysmtd/obj/EXECUTABLES/hello_world_intermediates/test.d -o /home/me/cm/out/target/product/galaxysmtd/obj/EXECUTABLES/hello_world_intermediates/test.o external/test/test.c

调试信息 - 环境变量:

ANDROID_BUILD_PATHS="/home/me/cm/out/host/linux-x86/bin:/home/me/cm/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin:/home/me/cm/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin:/home/me/cm/prebuilts/gcc/linux-x86/mips/mipsel-linux-android-4.7/bin:/home/me/cm/development/emulator/qtools:/home/me/cm/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin:/home/me/cm/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin:/home/me/cm/development/scripts:/home/me/cm/prebuilts/devtools/tools:"
ANDROID_BUILD_TOP="/home/me/cm"
ANDROID_DEV_SCRIPTS="/home/me/cm/development/scripts:/home/me/cm/prebuilts/devtools/tools"
ANDROID_EABI_TOOLCHAIN="/home/me/cm/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin"
ANDROID_HOST_OUT="/home/me/cm/out/host/linux-x86"
ANDROID_JAVA_TOOLCHAIN="/usr/lib/jvm/java-6-sun/bin"
ANDROID_PRE_BUILD_PATHS="/usr/lib/jvm/java-6-sun/bin:"
ANDROID_PRODUCT_OUT="/home/me/cm/out/target/product/galaxysmtd"
ANDROID_PROMPT_PREFIX="[arm-cm_galaxysmtd-userdebug]"
ANDROID_QTOOLS="/home/me/cm/development/emulator/qtools"
ANDROID_TOOLCHAIN="/home/me/cm/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin"
ARM_EABI_TOOLCHAIN="/home/me/cm/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin"

解决方法是使用编译 zlib 共享库,但我为什么要这样做,因为它应该是一个标准的“稳定”NDK 库!

注意this 没有帮助:

是的,很抱歉,但这确实是 NDK 构建中的一个错误 脚本。现在,您可以替换:

LOCAL_LDLIBS := -lz

LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -lz

很抱歉,这将在下一个 NDK 版本中修复。

【问题讨论】:

  • 实际上,Android NDK 确实在所有平台的常规 include 目录中包含“zlib.h”。我猜这个错误与不使用“官方”NDK 的 CyanogenMod 构建系统有关。

标签: android android-ndk linker-errors zlib


【解决方案1】:

你可能缺少zlib头文件,尝试安装libz-dev开发包,例如

sudo apt-get install libz-dev

【讨论】:

  • 我不明白。你最近的“安装 libz-dev”回答热潮是怎么回事?这个基于 debian 的答案如何普遍做到这一点?您为什么在代表 OP 添加自我回答 20 分钟后在此处添加答案(您这样做是非常正确的)?
  • 多个答案都可以。我已经从问题中重新发布了 OP 答案,因为这是发布的正确位置,但我不确定他的方法是否是问题的最终解决方案。这个解决了zlib.h: No such file or directory 错误直接通过安装缺少的开发包提供zlib 的头文件。 Apt-get 非常常见,具体取决于您在哪里开发 Android 应用程序。我可以看到 OP 正在使用基于路径的 Linux。
  • 据我所知,apt-get 默认只适用于 debian 和 ubuntu。我可以接受这是对所有这些问题的有效答案,但是您确定它们中的任何一个都不能作为彼此的重复而关闭吗?对多个问题(我的原始问题提到)的(接近)重复答案的主要警告是,如果相同的答案适用,那么问题通常是重复的,在这种情况下,关闭是正确的行动。我并不是说你一定是错的,我只是想让你确保你做的是正确的事情。
  • 啊,我刚刚找到了你的另一个,你投票关闭为骗子,然后在 7 分钟后回答了同样的问题。这是我的问题。
  • @AndrasDeak 我已经标记了这些可以复制的内容,但其中一些具有不同的上下文和不同的操作系统。其中一些特别与 Vagrant、OS X、Ruby 或 Android 相关,因此它们并没有真正重复,但它们有共同的问题,缺少 zlib 头文件。这些是我的猜测,由于缺少头文件包,Makefile 没有正确生成,因为我已经在 Ubuntu 上确认了这个解决方案,我自己有这个问题。我在几个地方发帖帮助人们快速找到问题,因为大多数答案都不清楚。
【解决方案2】:

这似乎是一个错误。我们需要通过构建并包含android_external_zlib 来使用解决方法。如果最终在我的模块Android.mk 中使用带有这些添加的 CyanogenMod 构建系统:

LOCAL_C_INCLUDES    += $(LOCAL_PATH)/../zlib/src
LOCAL_SHARED_LIBRARIES  += libz

但是对于这个问题的大量受众(3k+ 次浏览),应该有人发布仅基于 Android NDK 的完整解决方案。

来源:@KrisWebDev

【讨论】:

    猜你喜欢
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 2013-03-13
    • 2017-05-09
    • 2021-05-15
    • 2014-10-31
    相关资源
    最近更新 更多