CMake CheckIncludeFiles检测sys/tree.h不存在 无法调用兼容头报错
排查解决步骤
1. 验证CMake条件判断逻辑
两个环境的HAVE_SYS_TREE缓存值均为空,说明CHECK_INCLUDE_FILES已经正确识别到系统缺失头文件,CentOS未触发兼容分支大概率是CMake版本对空值的判断逻辑差异导致的。
在CMakeLists.txt的CHECK_INCLUDE_FILES(sys/tree.h HAVE_SYS_TREE)行后添加调试输出代码:
message(STATUS "HAVE_SYS_TREE 值: '${HAVE_SYS_TREE}', 取反判断结果: ${NOT HAVE_SYS_TREE}")
删除build目录下的CMake缓存后重新执行cmake,确认CentOS环境下NOT HAVE_SYS_TREE是否被判定为FALSE。
2. 修正条件判断语句
如果确认是判断逻辑失效,将原有的if (NOT HAVE_SYS_TREE)替换为兼容性更强的写法,覆盖变量未定义、为空、为FALSE三种场景:
if (NOT DEFINED HAVE_SYS_TREE OR NOT HAVE_SYS_TREE OR "${HAVE_SYS_TREE}" STREQUAL "")
修改后重新生成编译配置,即可触发兼容头文件的生成逻辑。
3. 确认头文件搜索路径配置
兼容头文件生成后需要确保对应目录被加入头文件搜索路径,你可以在上述if分支末尾手动添加配置:
include_directories(${CMAKE_CURRENT_BINARY_DIR}/compat)
避免生成的兼容头文件无法被编译器找到。
4. 临时应急方案
如果需要快速完成编译,可以直接将libevhtp源码目录下的compat/sys/tree.h手动复制到CentOS系统头文件路径:
sudo mkdir -p /usr/include/sys sudo cp 你的源码路径/libevhtp/compat/sys/tree.h /usr/include/sys/
之后重新执行编译即可。
内容的提问来源于stack exchange,提问作者Tiina
相关产品推荐
相关产品推荐

