【问题标题】:How to properly include libraries in a CMake project如何在 CMake 项目中正确包含库
【发布时间】:2018-08-25 11:37:51
【问题描述】:

例如,我有一个如下所示的项目:

project/
  subproject/
     CMakeLists.txt
     file1.h

  CMakeLists.txt
  main.cpp

项目/CMakeLists.txt

project(some_project)
add_subdirectory(subproject)
set(SOURCE_FILES main.cpp)
add_executable(main ${SOURCE_FILES})
target_link_libraries(main subproject)

项目/子项目/CMakeLists.txt:

project(subproject)
add_library(subproject_lib INTERFACE)
target_sources(subproject_lib INTERFACE file1.h)
target_include_directories(subproject_lib INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})

项目/main.cpp

#include <file1.h>

// .. do something

现在,当我尝试构建 project 时,我得到一个 No such file or directory error

另一个例子是当我尝试包含 dlib 时。当我做类似的事情时

add_subdirectory(dlib-19.9)
target_link_libraries(main dlib::dlib)

这似乎正是 dlib 自己的示例 CMakeList.txt 中的内容,我收到错误消息。

那么,如何以正确的方式在 CMake 中包含库?

【问题讨论】:

  • 对于include&lt;&gt;,您需要确保 target_include_directories(subproject_lib) 包含 SYSTEM 参数关键字
  • @RichardHodges 仍然不起作用。使用include "" 它可以工作...
  • @RichardHodges 与否。只是include ""在当前目录下搜索头文件,并不是CMake正确调用了-I编译选项
  • 也可以在subproject/cmakelists.txt中添加:add_library(subproject::subproject ALIAS subproject)。所以在主 cmake 中你可以使用 subproject::subproject (如果以后你选择通过 find_package install export/namespace 的东西,命名相同)也避免你的名字中的 lib 否则文件在 Linux 上变成 libsubproject_lib.so -_- (或者你需要重命名 output_library_name...)

标签: c++ cmake dlib


【解决方案1】:

您的库名为 subproject_lib,但您将 mainsubproject 链接。我不知道为什么,但由于某种原因,如果目标不存在,CMake 不会抱怨。

【讨论】:

  • for some reason CMake does not complain if the target does not exist. - target_link_libraries 的非目标参数被视为库名称并作为链接器的 -l&lt;name&gt; 选项传递。链接器会检测到缺少的库,但在特定情况下,在链接器之前的编译阶段会发生错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
  • 2019-11-05
  • 2021-08-05
  • 2016-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多