第一次处理 CMake、第三方(仅标头)库时遇到问题

Facing problems in my first time handling CMake, Third party(header only) libraries

提问人:porridgewithraisins 提问时间:7/5/2022 最后编辑:porridgewithraisins 更新时间:7/5/2022 访问量:166

问:

我想使用以下库 https://github.com/gmeuli/caterpillar

它的文档说它是一个仅标头的库,我应该“直接将其集成到我的源文件中”。它还依赖于其他几个库,其中一个我也需要直接使用。#include <caterpillar/caterpillar.h>

到目前为止,我已经完成了以下工作:

  1. 创建 CMake 项目以生成“可执行文件”(带有 VSCode 扩展)
  2. 创建了一个“lib”文件夹,我在里面做了
git clone https://github.com/gmeuli/caterpillar
  1. 然后,我在我的 cmake 文件中做了。include_directories(lib)
  2. 但在我的单一文件中并不完全有效。#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
C++ Linux CMake 构建 仅标头

评论

0赞 john 7/5/2022
对 CMake 进行疯狂的猜测更改并进行必要的调整,以使该代码正常工作。#include <caterpillar/caterpillar.h>#include <caterpillar.h>
0赞 john 7/5/2022
当然,您真正应该做的是查阅该库的文档,看看他们希望您如何包含他们的头文件。
0赞 porridgewithraisins 7/5/2022
试过了,没有用。但也许我做错了“对 CMake 的必要调整”。
0赞 porridgewithraisins 7/5/2022
@john,他们的文档说.使用此信息编辑的问题#include <caterpillar/caterpillar.h>
0赞 john 7/5/2022
好吧,忽略我说的话。

答:

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>