cmake:创建一个新的库目标,它由一个预构建的库组成

时间:2016-04-22 16:30:37

标签: c++ boost cmake

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

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

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

在boost-build中,您可以使用<file>功能来&#34;包裹&#34;或&#34;别名&#34;一个预建的库,并添加额外的&#34;使用要求&#34; (编译器标志等)将使用库添加到所有目标。

lib foo 
: 
: <file>vendor/library.a
:
: <include>vendor
;
  • 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")

但是,如果有几个目标需要使用foo,那么对于每个目标都会重复这3个调用,这会变得非常繁重。

foo的消费者更容易拥有其他具有

的目标
target_link_libraries     (foo ${CMAKE_CURRENT_LIST_DIR}/vendor/library.a)
target_compile_options    (foo PUBLIC ...)
target_include_directories(foo PUBLIC ...)

问题:

  • 我可以创建一个库目标,它包含一个预构建的库,可以让我做我所描述的内容吗?

编辑以回复评论:

我尝试创建IMPORTED库(如here所述):

add_library(foo STATIC IMPORTED)
set_property(TARGET foo PROPERTY IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/vendor/library.a)

然而,当我尝试设置包含目录时,我收到错误:

target_include_directories(foo SYSTEM PUBLIC "${CMAKE_CURRENT_LIST_DIR}/vendor")

错误:

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

1 个答案:

答案 0 :(得分:1)

  1. 您需要导入预先构建的库。 here是如何做到的教程。
  2. 使结果目标&#34;完成&#34;你需要添加某些属性。不幸的是,由于this CMake issue,无法使用常规技术完成此操作。所以你必须手动设置这些道具,如this SO QA
  3. 中所述