提问人:porridgewithraisins 提问时间:7/5/2022 最后编辑:porridgewithraisins 更新时间:7/5/2022 访问量:166
第一次处理 CMake、第三方(仅标头)库时遇到问题
Facing problems in my first time handling CMake, Third party(header only) libraries
问:
我想使用以下库 https://github.com/gmeuli/caterpillar
它的文档说它是一个仅标头的库,我应该“直接将其集成到我的源文件中”。它还依赖于其他几个库,其中一个我也需要直接使用。#include <caterpillar/caterpillar.h>
到目前为止,我已经完成了以下工作:
- 创建 CMake 项目以生成“可执行文件”(带有 VSCode 扩展)
- 创建了一个“lib”文件夹,我在里面做了
git clone https://github.com/gmeuli/caterpillar
- 然后,我在我的 cmake 文件中做了。
include_directories(lib)
- 但在我的单一文件中并不完全有效。
#include <caterpillar/caterpillar.h>
main.cpp
我尝试了各种 CMake 函数,它要么给出错误“没有这样的文件或目录”,要么给出“无法打开源文件......依赖于 caterpillar/caterpillar.h“,具体取决于我如何处理 cmake 文件。caterpillar/caterpillar.h
供参考:
猫 ~/项目/main.cpp
#include <caterpillar/caterpillar.hpp>
#include <lorina/lorina.hpp> //how do I include this ? it's in the lib folder of caterpillar itself, or do I need to have a copy of it in my lib folder too
int main()
{
// stuff in lorina:: namespace
// stuff in caterpillar:: namespace
return 0;
}
猫 ~/project/CMakeLists.txt
include_directories(lib)
//... rest is stuff like CXX standard, etc etc
树 ~/project
main.cpp
lib/
caterpillar/
build/
cmake generated stuff
CMakeLists.txt
答:
0赞
halfelf
7/5/2022
#1
首先,现代 cmake 建议而不是旧的,以获得更好的范围管理。target_include_directories()
include_directories()
实际上不在目录中。这就是你的代码不起作用的原因。<caterpillar/caterpillar.hpp>
$PROJECT_SOURCE_DIR/lib
CMakeLists 示例:
cmake_minimum_required(VERSION 3.22)
project(myproject)
set(CMAKE_CXX_STANDARD 17)
add_executable(my_project main.cpp)
target_include_directories(my_project PRIVATE ${PROJECT_SOURCE_DIR}/lib/caterpillar/include)
# project_src_dir/lib/catepillar/include/ is the directory where you find the headers like <catepillar/catepillar.hpp>
target_include_directories(my_project PRIVATE ${PROJECT_SOURCE_DIR}/lib/caterpillar/lib/lorina)
caterpillar
的文档描述了如何以传统风格包含他们的标题,假设读者可以理解这一点并决定自己将标题放在哪里。(这意味着您不需要整个 git 存储库,而只需要“include”目录。
对于这个特定问题,该库提供了一个详细的 CMakeLists.txt 供用户包括:
cmake_minimum_required(VERSION 3.22)
project(my_project)
set(CMAKE_CXX_STANDARD 17)
add_subdirectory(lib/caterpillar)
# this works because "project_src_dir/lib/catepillar/CMakeLists.txt" exists.
add_executable(my_project main.cpp)
target_link_libraries(my_project PRIVATE caterpillar)
# you need to tell cmake to add all catepillar settings into your project
评论
0赞
porridgewithraisins
7/5/2022
谢谢!它似乎几乎起作用了。但是,我现在收到我提到的第二个错误。[build] /home/sandy/revmd5/lib/caterpillar/include/caterpillar/details/utils.hpp:6:10: fatal error: tweedledum/gates/gate_set.hpp: No such file or directory [build] 6 | #include <tweedledum/gates/gate_set.hpp>
评论
#include <caterpillar/caterpillar.h>
#include <caterpillar.h>
#include <caterpillar/caterpillar.h>