使用Conan+CMake构建C++项目时提示找不到RmlUi头文件
问题根因
- 构建流程不规范,使用源码内编译且目录不统一:
conan install指定将工具链、依赖CMake配置文件全部输出到cmake-build-release目录,但你直接在项目根目录执行cmake .做源码内构建,生成的CMake缓存很容易出现路径不匹配、旧配置覆盖Conan工具链参数的问题,导致CMakeDeps生成的rmlui依赖配置没有被正确加载。 find_package缺少REQUIRED约束:就算CMake没找到Conan安装的rmlui,配置阶段也不会直接报错终止,直到编译阶段才发现没有添加rmlui的头文件搜索路径,触发找不到RmlUi/Core.h的错误。- 额外注意:你代码中引用的
Backends/RmlUi_Backend.h、Shell/Shell.h是RmlUi官方示例的私有组件,ConanCenter的正式rmlui包不会随安装包部署这部分内容,解决Core.h的问题后需要单独处理这部分依赖。
修复步骤
- 先清理源码根目录下之前源码内编译生成的缓存,避免旧配置干扰:
rm -rf CMakeCache.txt CMakeFiles/
- 保持原有conan安装命令即可,所有依赖生成文件统一输出到独立构建目录
cmake-build-release:
conan install . --install-folder cmake-build-release --build=missing
- 执行CMake配置时,显式指定构建目录、源码目录,不要在源码根目录直接生成构建文件:
cmake -B cmake-build-release -S . -DCMAKE_TOOLCHAIN_FILE=cmake-build-release/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release
这一步执行时CMake会自动读取Conan工具链中配置的依赖搜索路径,正确加载rmlui的依赖配置,自动添加头文件搜索路径、链接库路径。
4. 编译时指定对应构建目录即可:
cmake --build cmake-build-release
优化建议
建议把CMakeLists.txt中的find_package行加上REQUIRED关键字,后续如果依赖加载失败,会在CMake配置阶段直接报错,不会拖到编译阶段才暴露问题,修改后对应内容为:
find_package(rmlui REQUIRED)
如果修复后编译提示找不到Backends/RmlUi_Backend.h和Shell/Shell.h,直接把RmlUi源码中对应Backends、Shell目录下的源码拷贝到自身项目中作为项目源码编译即可,ConanCenter的rmlui包默认不会打包这部分示例组件。
内容的提问来源于stack exchange,提问作者Nils van Lück
相关产品推荐
相关产品推荐

