Windows下用CMake构建log4cxx依赖apr-util时编译报错
解决Windows下CMake编译apr-util依赖失败的问题
错误分析
从编译错误信息来看,核心问题集中在三点:
- 架构不兼容:
winnt.h抛出的No supported target architecture错误,说明编译器目标架构配置存在冲突,大概率是MSYS2环境与Visual Studio编译器的架构不匹配。 - APR头文件未关联:
apr_network_io.h无法找到,表明CMake未正确指向已编译完成的APR库的头文件路径。 - 标准库头文件冲突:
stdlib.h中的语法错误(如_exit不在参数列表、缺少分号),是因为MSVC编译器误加载了MSYS2的UCRT标准库头文件,两者语法规范不一致导致冲突。
可行解决方案
1. 统一编译工具链与架构
- 确认已编译的APR是使用Visual Studio编译器构建的,而非MSYS2的gcc。若APR是用MSYS2编译的,需重新在Visual Studio开发者命令提示符中编译APR,保证与apr-util的工具链完全一致。
- 配置apr-util的CMake时,显式指定APR的安装路径:
替换cmake .. -G "Visual Studio 17 2022" -A x64 -DAPR_ROOT=C:\path\to\apr-installC:\path\to\apr-install为你APR编译后的实际安装目录。
2. 避免MSYS2与MSVC环境混合
- 不要在MSYS2 shell中运行CMake编译apr-util,改用对应架构的Visual Studio开发者命令提示符(如x64 Native Tools Command Prompt)启动CMake,确保环境变量指向MSVC工具链,而非MSYS2的。
- 配置CMake时明确指定目标架构,例如:
确保与APR编译时的架构完全一致(x64/Win32)。cmake .. -G "Visual Studio 17 2022" -A x64
3. 匹配APR与apr-util版本
- 当前使用的apr-util 1.6.3与apr 1.7.4存在跨小版本差异,可能引发兼容性问题。建议更换为apr-util 1.7.x系列版本(与apr 1.7.4同主版本),重新尝试编译。
4. 调整头文件路径优先级
- 在apr-util的CMakeLists.txt中,强制APR头文件路径优先级高于系统路径:
避免编译器误加载MSYS2的系统头文件。INCLUDE_DIRECTORIES(BEFORE ${APR_INCLUDE_DIR})
内容的提问来源于stack exchange,提问作者rdal
相关产品推荐
相关产品推荐

