【问题标题】:Facing problems in my first time handling CMake, Third party(header only) libraries在我第一次处理 CMake 时遇到问题,第三方(仅标头)库
【发布时间】:2022-07-05 17:13:37
【问题描述】:

我想使用以下库 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 本身的错误“没有这样的文件或目录”,要么给出了“无法打开源文件...依赖于 caterpillar/caterpillar.h”,具体取决于关于我是如何弄乱 cmake 文件的。

供参考:

cat ~/project/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;
}

cat ~/project/CMakeLists.txt

include_directories(lib)
//... rest is stuff like CXX standard, etc etc

树~/项目

main.cpp
lib/
    caterpillar/
build/
    cmake generated stuff
CMakeLists.txt

【问题讨论】:

  • 大胆猜测将 #include &lt;caterpillar/caterpillar.h&gt; 更改为 #include &lt;caterpillar.h&gt; 并对 CMake 进行必要的调整以使该代码正常工作。
  • 当然,您真正应该做的是查阅该库的文档,看看他们希望您如何包含他们的头文件。
  • 试过了,没用。但也许我做错了“对 CMake 的必要调整”。
  • @john,他们的文档说 #include &lt;caterpillar/caterpillar.h&gt; 。使用此信息编辑问题
  • 好吧,别说了。

标签: c++ linux cmake build header-only


【解决方案1】:

首先,现代 cmake 推荐 target_include_directories() 而不是旧的 include_directories() 以更好地管理范围。

其实&lt;caterpillar/caterpillar.hpp&gt;不在$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 存储库,而只需要“包含”目录。)


针对这个具体问题,库提供了详细的 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

【讨论】:

  • 谢谢!它似乎几乎可以工作。但是,我现在得到了我提到的第二个错误。 [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 &lt;tweedledum/gates/gate_set.hpp&gt;
  • @porridgewithraisins 已更新。
猜你喜欢
  • 2020-03-04
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 2022-12-18
  • 2021-12-01
  • 2020-08-12
  • 1970-01-01
  • 2012-06-01
相关资源
最近更新 更多