cmake:创建一个包含预构建库的新库目标

Ste*_*mer 6 c++ boost cmake

我正在尝试在 cmake 中创建一个自定义目标:

  • 链接供应商提供的档案
  • 添加 target_compile_options(... PUBLIC ...)
  • 添加 target_include_directories(... PUBLIC ...)

通过这种方式,消费者可以链接到我的新目标并设置必要的包含目录和编译选项。

在 boost-build 中,您可以使用该<file>功能来“包装”或“别名”预构建的库,并添加额外的“使用要求”(编译器标志等),这些要求将添加到使用该库的所有目标中。

lib foo 
: 
: <file>vendor/library.a
:
: <include>vendor
;
Run Code Online (Sandbox Code Playgroud)
  • 这别名vendor/library.a为新库foo
  • 当另一个目标使用foo它时,它的包含路径也将更新。
  • 然后使用的代码foo将能够#include "foo.h",并且将找到该文件,因为vendor它已添加到包含路径中。

我正在寻找一种在 CMake 中做同样事情的方法。

我目前的做法是这样的:

find_library(LIB_FOO library.a PATHS ${CMAKE_SOURCE_DIR}/path/to/vendor NO_DEFAULT_PATH)

target_link_library       (my_target ${LIB_FOO})
target_include_directories(my_target PRIVATE "${CMAKE_SOURCE_DIR}/path/to/vendor")
Run Code Online (Sandbox Code Playgroud)

然而,如果有多个目标需要使用,foo那么这 3 次调用就会为每个目标重复,这变得非常繁重。

对于消费者来说,foo拥有一些其他目标会容易得多

target_link_libraries     (foo ${CMAKE_CURRENT_LIST_DIR}/vendor/library.a)
target_compile_options    (foo PUBLIC ...)
target_include_directories(foo PUBLIC ...)
Run Code Online (Sandbox Code Playgroud)

题:

  • 我可以创建一个新的库目标,它包含一个预建的库,允许我执行我所描述的操作吗?

编辑以回应评论:

我试图创建一个IMPORTED库(如描述这里):

add_library(foo STATIC IMPORTED)
set_property(TARGET foo PROPERTY IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/vendor/library.a)
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试设置包含目录时,出现错误:

target_include_directories(foo SYSTEM PUBLIC "${CMAKE_CURRENT_LIST_DIR}/vendor")
Run Code Online (Sandbox Code Playgroud)

错误:

CMake Error at vendor/CMakeLists.txt:39 (target_include_directories):
  Cannot specify include directories for imported target "foo".
Run Code Online (Sandbox Code Playgroud)

use*_*253 1

  1. 您需要导入预先构建的库。是如何操作的教程。
  2. 为了使结果目标“完整”,您需要向其添加某些属性。不幸的是,由于这个 CMake 问题,这不能使用通常的技术来完成。所以你必须手动设置这些道具,就像这个 SO QA中描述的那样