为Android编译IOzone可执行文件遇头文件缺失问题
解决Android NDK编译IOzone时缺失头文件的问题
你遇到的核心问题是Android NDK的Bionic C库默认不包含aio.h这类POSIX异步IO相关头文件,而直接用make编译时应该是已经配置了适配Android的编译参数或禁用了相关特性。这里有几个简便的解决思路:
1. 禁用IOzone的异步IO特性
这是最直接的方案,IOzone本身支持编译时禁用异步IO,这样就不会依赖aio.h了。在你的Android.mk中添加编译宏定义:
LOCAL_CFLAGS += -DNO_ASYNC_IO
这个宏会让IOzone源码跳过所有异步IO相关代码,也就不会尝试引入aio.h了。
2. 直接使用IOzone自带的Android适配编译方式
IOzone其实已经提供了针对Android的编译配置,不用通过Android Studio的externalNativeBuild绕圈,步骤更简单:
- 先导出NDK交叉编译工具链路径:
export PATH=$PATH:/home/mbosnjak/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin - 指定对应ABI的交叉编译编译器(以
armeabi-v7a为例):export CC=armv7a-linux-androideabi15-clang - 进入IOzone源码目录,执行编译命令:
如果没有make androidandroid这个编译目标,也可以直接修改源码根目录的Makefile,将编译工具链替换为NDK的clang,再执行make即可。
3. 升级NDK版本并添加头文件路径
如果你确实需要异步IO特性,可以尝试升级到较新的NDK版本(比如r21及以上),新NDK对POSIX标准的支持更完善。另外,如果IOzone源码中自带了aio.h这类头文件,可以在Android.mk中添加头文件搜索路径:
LOCAL_C_INCLUDES += $(LOCAL_PATH)/path/to/your/headers
把path/to/your/headers替换为实际存放这些头文件的目录。
至于为什么直接用make能正常编译,大概率是你之前的make环境已经配置了交叉编译参数,或者默认禁用了异步IO特性,而Android Studio的externalNativeBuild没有继承这些配置,才导致头文件缺失的报错。
内容的提问来源于stack exchange,提问作者Melvin Bosnjak
相关产品推荐
相关产品推荐

