在Embarcadero C++Builder 10.3中用CMake编译OpenCV遇F1003错误求助
为完成项目,需在Embarcadero C++Builder 10.3中使用OpenCV。在OpenCV论坛找到编译相关帖子后,在RAD Studio命令提示符中执行以下CMake命令:
cmake.exe -G"Borland Makefiles" -DCMAKE_BUILD_TYPE=Debug -DBUILD_OPENEXR=OFF -DBUILD_opencv_world=OFF -DBUILD_PERF_TESTS=OFF -DWITH_WEBP=OFF -DWITH_OPENCL=OFF -DWITH_OPENEXR=OFF
生成构建文件后,执行make或make install时出现如下错误:
Fatal F1003 C:/PROGRA~2/EMBARC~1/Studio/20.0/include/DINKUM~2\yvals.h 34: Error directive: Please use headers from dinkumware directory
查看对应文件,错误来自这段代码:
#if !defined(__clang__) #error Please use headers from dinkumware directory #endif
尝试通过排除报错相关内容忽略错误,部分选项可行,但遇到无法排除的选项时仍报错。猜测是CMake配合bcc32编译器未启用Clang导致该错误,但上述帖子同样使用bcc32却未出现此问题。疑问:该问题是否仅出现于新版本?或有何解决办法?
错误原因
这个错误是因为C++Builder 10.3的Dinkumware标准库头文件强制要求使用Clang编译器,而你当前用Borland Makefiles生成的构建脚本默认调用了旧版的bcc32编译器(非Clang内核),触发了头文件里的__clang__宏检查。
至于帖子未出现问题,大概率是两种情况:要么帖子使用的是C++Builder 10.2及更早版本(当时头文件还没加这个强制检查),要么帖子里实际配置了Clang编译器但未明确说明。
具体解决步骤
切换到Clang-based编译器的CMake配置
放弃Borland Makefiles生成器,改用支持Clang的生成器,同时手动指定Clang版本的编译器(bcc32c/bcc32x)。修改后的CMake命令示例:cmake.exe -G"CodeBlocks - Borland Makefiles" -DCMAKE_C_COMPILER=bcc32c -DCMAKE_CXX_COMPILER=bcc32c -DCMAKE_BUILD_TYPE=Debug -DBUILD_OPENEXR=OFF -DBUILD_opencv_world=OFF -DBUILD_PERF_TESTS=OFF -DWITH_WEBP=OFF -DWITH_OPENCL=OFF -DWITH_OPENEXR=OFF这里
bcc32c是Embarcadero基于Clang开发的C/C++编译器,符合头文件的宏检查要求。使用正确的RAD Studio命令提示符环境
打开RAD Studio安装目录下的Clang命令提示符(而非普通的RAD Studio命令提示符),这个环境已经预先配置好Clang编译器的路径和相关环境变量,确保CMake能正确识别到bcc32c。验证CMake的编译器检测结果
运行CMake命令时,注意查看控制台输出,确认CMake检测到的C/C++编译器是bcc32c而非旧版bcc32。如果检测结果不对,说明环境变量配置有误,需要手动通过CMAKE_C_COMPILER和CMAKE_CXX_COMPILER参数指定编译器路径。关于版本差异的说明
这个错误确实是C++Builder 10.3及以后版本引入的。Embarcadero从10.2版本开始逐步将Clang作为默认编译器,旧版bcc32已不再被官方推荐用于新项目,因此在10.3的Dinkumware头文件中添加了这个强制检查,倒逼用户切换到Clang编译器。
内容的提问来源于stack exchange,提问作者Xander-Vreeswijk

