首次使用CMake引入header-only库caterpillar报错如何解决
问题根因
两个配置错误直接导致编译失败:
- 头文件搜索路径配错:caterpillar的公开头文件存放在仓库的
include/子目录,不是仓库根目录。仅把项目下的lib/目录加入包含路径,编译器无法匹配到caterpillar/caterpillar.hpp的文件层级。 - 未拉取依赖子模块:caterpillar将lorina等所有依赖库以git子模块形式存放在自身仓库的
lib/目录下,普通git clone默认不会拉取子模块内容,对应依赖文件夹为空,自然会报依赖头文件不存在的错误。 - 不需要单独在项目lib目录额外存放lorina源码,直接使用caterpillar拉取的对应版本即可,避免版本不兼容问题。
修复步骤
1. 拉取完整依赖
进入本地caterpillar目录,执行命令拉取所有递归子模块:
cd lib/caterpillar git submodule update --init --recursive
执行完成后可检查lib/caterpillar/lib/lorina目录,确认内部存在完整源码即可。
2. 修正CMake配置(推荐最简方案)
删除原来的include_directories(lib)配置,直接引入caterpillar自带的CMake配置,自动处理所有依赖路径,不需要手动逐个添加依赖的include目录:
# caterpillar依赖C++17及以上标准 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 引入caterpillar子项目,EXCLUDE_FROM_ALL避免编译caterpillar不需要的额外target add_subdirectory(lib/caterpillar EXCLUDE_FROM_ALL) # 替换成你自己的可执行文件名和源文件路径 add_executable(your_app main.cpp) # 链接caterpillar的header-only target,所有依赖的头文件路径会自动传递到你的项目 target_link_libraries(your_app PRIVATE caterpillar)
3. 代码验证
main.cpp的头文件引入不需要修改,保持原有写法即可:
#include <caterpillar/caterpillar.hpp> #include <lorina/lorina.hpp> int main() { // 直接调用caterpillar::、lorina::命名空间下的接口即可 return 0; }
重新执行CMake配置、编译即可正常通过。
手动配置路径方案(可选)
如果不想引入caterpillar的子CMake配置,也可以手动给你的target添加所有需要的包含路径:
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_executable(your_app main.cpp) target_include_directories(your_app PRIVATE ${PROJECT_SOURCE_DIR}/lib/caterpillar/include ${PROJECT_SOURCE_DIR}/lib/caterpillar/lib/lorina/include ${PROJECT_SOURCE_DIR}/lib/caterpillar/lib/mockturtle/include ${PROJECT_SOURCE_DIR}/lib/caterpillar/lib/fmt/include ${PROJECT_SOURCE_DIR}/lib/caterpillar/lib/kitty/include ${PROJECT_SOURCE_DIR}/lib/caterpillar/lib/bill/include ${PROJECT_SOURCE_DIR}/lib/caterpillar/lib/any/include ${PROJECT_SOURCE_DIR}/lib/caterpillar/lib/json/include )
如果后续编译提示缺少其他头文件,去lib/caterpillar/lib/下找到对应库的include目录,按相同格式追加到路径列表即可。
内容的提问来源于stack exchange,提问作者porridgewithraisins
相关产品推荐
相关产品推荐

