【问题标题】:Android can't include linux in C program with Android.mkAndroid 不能在带有 Android.mk 的 C 程序中包含 linux
【发布时间】:2017-03-30 17:23:38
【问题描述】:

我正在尝试为 Android 6 编译一个 C 程序。这是我的Android.mk

APP_PLATFORM := android-23
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Enable PIE manually. Will get reset on $(CLEAR_VARS). This
# is what enabling PIE translates to behind the scenes.
LOCAL_CFLAGS += -fPIE -DHAVE_FANOTIFY=1 -DHAVE_SYS_FANOTIFY=0
LOCAL_LDFLAGS += -fPIE -pie
# give module name
LOCAL_MODULE := fsmon
# list your C files to compile
LOCAL_SRC_FILES := inotify.c fanotify.c util.c main.c
# this option will build executables instead of building library for android application.
include $(BUILD_EXECUTABLE)

fanotify.c下面的include中写着:

#include <linux/fanotify.h>

当我尝试使用ndk-build时,出现以下错误:

fsmon/jni/fanotify.c:51:10: fatal error: 'linux/fanotify.h' file not found
#include <linux/fanotify.h>
         ^

标头fanotify.h 存在于ndk 路径/Android/Sdk/ndk-bundle/sysroot/usr/include/linux

有什么建议吗?

编辑:如果我尝试包含 sys/fanotify.h,则会出现同样的错误

【问题讨论】:

  • 嗯好吧,ndk-bundle/platforms/android-23/arch-arm/usr/include/linux 中不存在它...我如何告诉它从 sysroot/ 使用它?

标签: android c android-ndk android.mk


【解决方案1】:

您可以使用 LOCAL_C_INCLUDES 为您的模块指定其他包含路径。

LOCAL_C_INCLUDES := /Android/Sdk/ndk-bundle/sysroot/usr/include/

https://developer.android.com/ndk/guides/android_mk.html#mdv

【讨论】:

  • 好的,谢谢,这行得通。但现在我得到 5 个错误:/Android/Sdk/ndk-bundle/platforms/android-9/arch-arm/usr/include/asm/signal.h:101:3: error: typedef redefinition with different types ('struct (anonymous struct at /Android/Sdk/ndk-bundle/platforms/android-9/arch-arm/usr/include/asm/signal.h:97:16)' vs 'struct sigaltstack') } stack_t; 然后我包含了 api 23,但随后出现 3 个错误:Android/Sdk/ndk-bundle/platforms/android-23/arch-arm/usr/include/signal.h:87:12: error: duplicate member '_u' 你有什么想法吗? `
  • 我认为您的设计可能不正确 - 您包含相同包含文件的不同版本,或者包含具有相同定义的不同包含文件。但我想,从你现在的状态来看,你可能应该尝试通过删除头文件重复或定义重复来逐个调试错误。
  • 嗯,是的,这很奇怪,因为创建了 64 位可执行文件。这只是 32 位版本的问题。头文件如何从 sysroot 链接到 android-9 api 也很奇怪。我现在尝试了很多变体,但没有成功......也许我会为这个问题创建另一个问题,另一个与 non-finding 库的问题已解决。
  • 所以如果你能找到一些东西......但感谢其他答案! stackoverflow.com/questions/43140359/…
  • 当然,我会解决这个问题并尽可能提供帮助!
【解决方案2】:

历史上 NDK 不会将标头向后移植到旧版本,但我们在 r14 中重新设计了一些东西,所以这是可能的:https://android.googlesource.com/platform/ndk/+/ndk-r14-release/docs/UnifiedHeaders.md

默认情况下,在 r14 中,您仍然可以使用旧形式的标题。新的“统一标题”具有您正在寻找的标题。如果您想尝试统一标头,请在 Application.mk 中设置 APP_UNIFIED_HEADERS := true(其他构建系统的设置可以在上面的链接中找到)。

在 r15(第一个 beta 版即将推出)中,默认值已更改为新标头,并且禁用它们的选项已更改(有关选项更改,请参阅 r15 中的同一文档:https://android.googlesource.com/platform/ndk/+/ndk-r15-release/docs/UnifiedHeaders.md)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    相关资源
    最近更新 更多