Linux下编译Android版openh264遇sys/cdefs.h缺失错误求助
你在NDK 17环境下编译OpenH264时遇到的这个错误,核心原因是编译器无法定位到sys/cdefs.h的正确路径,大概率是手动指定的sysroot参数干扰了OpenH264 Makefile的默认路径逻辑,或是NDK 17的路径结构与编译参数不匹配导致的。下面是几个针对性的解决方案:
方案一:移除手动指定的sysroot参数
OpenH264的Android编译脚本会根据你提供的NDKROOT和TARGET自动推导正确的sysroot路径,手动指定反而可能打乱这个逻辑。试试用这个简化命令重新编译:
make OS=android NDKROOT=/home/r/aff/ndk TARGET=android-27 NDKLEVEL=27
这个命令会自动使用NDK中对应API 27的arm架构平台根目录(/home/r/aff/ndk/platforms/android-27/arch-arm),编译器能在这里找到完整的系统头文件集合。
方案二:明确指定正确的大写SYSROOT变量
如果方案一无效,你可以尝试用大写的SYSROOT变量(OpenH264的Makefile通常使用大写变量名)指定符合NDK 17结构的路径:
make OS=android NDKROOT=/home/r/aff/ndk TARGET=android-27 NDKLEVEL=27 SYSROOT=/home/r/aff/ndk/platforms/android-27/arch-arm
这个路径是NDK中对应目标API的平台根目录,确保编译器能找到所有系统级头文件。
方案三:修改platform-android.mk的编译参数
如果上面的方法都没解决问题,可以直接调整OpenH264的编译配置文件。找到源码中的build/platform-android.mk,定位到编译cpu-features.o的段落(对应错误提示里的第96行),添加额外的头文件包含路径:
找到类似这样的代码行:
$(CC) $(CFLAGS) -c -o $@ $(CPU_FEATURES_SRC)
修改为:
$(CC) $(CFLAGS) -I$(NDKROOT)/sysroot/usr/include -c -o $@ $(CPU_FEATURES_SRC)
这样强制让编译器包含NDK sysroot下的usr/include目录,就能找到缺失的sys/cdefs.h了。
额外建议
NDK 17属于比较老旧的版本,OpenH264的最新源码对新NDK版本的兼容性更好。如果项目允许的话,你可以尝试升级NDK到r21及以上版本,能减少不少这类路径兼容问题。
内容的提问来源于stack exchange,提问作者Rafael Lima

