【问题标题】:ifaddrs.h header not found when compiling SDL for android为 android 编译 SDL 时找不到 ifaddrs.h 标头
【发布时间】:2014-12-16 01:36:12
【问题描述】:

我正在使用 SDL 制作一个需要访问 ifaddrs.h 的 android 游戏。当我为 mac 编译时,它工作正常。当我为 Android 编译时,它说找不到文件。

我正在尝试像这样包含它:

#include <ifaddrs.h>

所以我

gcc -M network.cpp

找到它所包含的文件的依赖关系,所以我可以找到 ifaddrs 的绝对位置,即

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/ifaddrs.h

所以当我

#include "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/ifaddrs.h"

它找到了它,但是在包含 ifaddrs 的其他一些依赖项时出错

#include <AvailabilityInternal.h>

好的。那么,当我尝试为 android 和为 mac 编译时,为什么包含行为不同? (在 Mac 上使用 ndkbuild 或 g++)?我怎样才能让它在android上工作?我错过了哪些知识/信息才能感知到这一切?

(注意-当前运行 OSX yosemite,10.10)

【问题讨论】:

    标签: android c++ macos include sdl


    【解决方案1】:

    您不能使用适用于 Android 的 MacOSX 包含。不同的平台,不同的 SDK。

    Android 没有自己的原生 ifaddrs.h 实现(因此没有 getifaddrs() 函数)。但是,有可用的第三方实现:

    https://github.com/kmackay/android-ifaddrs
    https://github.com/morristech/android-ifaddrs
    https://www.openhub.net/p/android-ifaddrs/

    Android 的 getifaddrs() 实现,因为 NDK 本身并不支持它。

    就像您在常规 Linux 上所期望的那样工作。

    【讨论】:

    • 天哪。太感谢了!不知道我是怎么在搜索中没有遇到的。让我觉得问起来很傻......
    • 存储库是 404 的。可用的叉子,例如在github.com/morristech/android-ifaddrs。但是,正如openhub.net/p/android-ifaddrs/commits 所示,这不是最新版本。
    • 在我的设备上,当我通过 WiFi 连接时,morristech 存储库中的代码会出现段错误。我在一些 Mozilla Beta 存储库中找到的 sourceheader 文件效果更好。为了使它工作,我不得不删除#if defined(ANDROID)#endififaddr 结构缺少成员 ifa_addrifa_dstaddr。如果需要,将 android_getifaddrs 重命名为 getifaddrs
    【解决方案2】:

    从 Android API 级别 24 (Android 7.0 Nougat) ifaddrs.h 开始正式支持,因此,如果您以该 SDK 为目标,则不再需要自定义实现。

    如果你的目标是旧版本,有谷歌的ifaddrs.h实现,你可以在Android源代码中找到它;最有趣的是 Gingerbread 实现,因为它只是一个 C++ 头文件,所以你不需要将它添加到你的项目或编译为单独的库,只需将它添加到你的包含和使用中。

    Android Gingerbread ifaddrs.h 实现文件网址如下:

    https://android.googlesource.com/platform/libcore/+/refs/heads/gingerbread-release/luni/src/main/native/ifaddrs-android.h

    这取决于您可以在同一存储库中轻松找到的其他 2 个包含文件。在其他 Android 版本源中也有其他 ifaddrs.h 实现,但是它们不仅仅是标头,因此它们的集成需要一个额外的步骤。

    我用 4 台设备(Android 5.0、6.0、7.0 和 9.0)测试了 Gingerbread 实现,没有遇到任何问题。

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    相关资源
    最近更新 更多