【问题标题】:cmake: create a new library target which consists of a prebuilt librarycmake:创建一个包含预构建库的新库目标
【发布时间】:2016-08-16 09:23:15
【问题描述】:

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

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

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

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

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".

【问题讨论】:

  • 我猜你需要导入一个预建库,就像它已经完成here
  • @user3159253 谢谢!虽然我如何将target_include_directories(foo PUBLIC ...) 添加到我的IMPORTED target 上?我收到一个错误Cannot specify include directories for imported target "foo".
  • this :) 还要检查这个issue 所以看来现在你必须使用set_target_properties(... INTERFACE_INCLUDE_DIRECTORIES ...)。看起来很难看,但希望可以工作
  • 谢谢!!如果您想将其放入答案中,我很乐意接受

标签: c++ boost cmake


【解决方案1】:
  1. 您需要导入预构建的库。 here 是如何做的教程。
  2. 要使生成的目标“完整”,您需要为其添加某些属性。不幸的是,由于this CMake issue,这不能使用通常的技术来完成。所以你必须手动设置这些道具,如this SO QA 中所述

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多