如何在CMake中将OpenCV仓库作为子目录添加并规避源码内构建错误?
解决OpenCV作为子目录时的源码内构建报错问题
问题根源
直接修改全局变量CMAKE_BINARY_DIR的方式不符合CMake工作逻辑,该变量是CMake根据构建目录自动设置的全局变量,手动赋值会导致OpenCV的构建目录与源码目录仍存在关联,触发它的防源码内构建检查。
无需修改OpenCV源码的解决方案
1. 为OpenCV指定独立的构建子目录
在父项目的CMakeLists.txt中,给OpenCV单独分配一个构建子目录,避免与它的源码目录冲突:
# 将OpenCV的构建文件放在父项目构建目录下的opencv子文件夹中 add_subdirectory(opencv ${CMAKE_BINARY_DIR}/opencv)
这样OpenCV的构建产物会生成在[父项目构建目录]/opencv下,和它的源码目录完全分离,绕过防源码内构建的检查。
2. 遵循CMake外部构建规范(推荐)
不要在CMakeLists.txt中硬编码构建目录,而是通过外部构建的方式启动CMake:
在父项目根目录执行以下命令:
mkdir build && cd build cmake ..
此时CMAKE_BINARY_DIR会自动指向当前的build目录,配合上面的add_subdirectory写法,OpenCV的构建文件会被隔离在build/opencv,完全满足它的目录要求。
3. 版本兼容性说明
你当前使用的CMake 3.16.3完全支持上述所有写法,不需要升级版本。若后续涉及更复杂的子项目隔离需求,CMake 3.20+提供了更精细的子目录环境控制,但当前场景下3.16.3足够覆盖需求。
内容的提问来源于stack exchange,提问作者TS_
相关产品推荐
相关产品推荐

