在Embarcadero C++ Builder 10.3编译OpenCV遇Ninja错误求助
在Embarcadero C++ Builder 10.3中构建OpenCV 3.4.16时libtiff编译报错的解决方法
问题背景
我需要在Embarcadero C++ Builder 10.3(32位经典编译器)中使用OpenCV 3.4.16,按照官方文档通过CMake 3.19.4和Ninja 1.11.1进行构建。完成CMake配置与文件生成后,执行ninja命令构建到约70/1345任务时失败,编译libtiff的tif_color.c、tif_aux.c等文件时出现以下错误:
C:\Program Files (x86)\Embarcadero\Studio\20.0\include\dinkumware64\xkeycheck.h:44:5: error: keyword defined before including C standard header #error keyword defined before including C standard header ^
使用环境
- CMake 3.19.4
- Ninja 1.11.1
- Embarcadero C++ Builder 10.3(32位经典编译器)
- OpenCV 3.4.16
解决方法
方法1:为libtiff添加C标准编译参数
这个错误源于Embarcadero编译器处理C代码时,预定义宏与标准C头文件的检查逻辑冲突。给libtiff强制启用C标准模式即可解决:
- 打开OpenCV源码目录下的
3rdparty/libtiff/CMakeLists.txt - 在
add_library(tiff ...)代码块之前添加以下CMake配置:if(CMAKE_C_COMPILER_ID MATCHES "Embarcadero") target_compile_options(tiff PRIVATE -A) endif()-A参数会让编译器严格遵循C标准,避免预定义宏干扰头文件检查。 - 清理之前的构建目录,重新运行CMake配置,再执行
ninja构建。
方法2:禁用TIFF模块(按需选择)
如果不需要OpenCV处理TIFF格式图片的功能,可以直接跳过libtiff的编译:
在CMake配置界面(或命令行)取消勾选WITH_TIFF选项,重新生成构建文件后执行ninja即可。
方法3:修正编译器头文件路径
错误中出现了dinkumware64目录,说明可能误加载了64位的头文件。在CMake配置时手动指定32位编译器的头文件路径:
在CMake命令行添加参数:
-DCMAKE_C_INCLUDE_PATH="C:\Program Files (x86)\Embarcadero\Studio\20.0\include"
确保CMake使用32位的标准头文件,而非64位版本。
内容的提问来源于stack exchange,提问作者Xander-Vreeswijk
相关产品推荐
相关产品推荐

