首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cmake:创建一个由预先构建的库组成的新库目标

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

Stack Overflow用户
提问于 2016-04-22 16:30:37
回答 1查看 6.1K关注 0票数 8

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

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

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

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

代码语言:javascript
复制
lib foo 
: 
: <file>vendor/library.a
:
: <include>vendor
;
  • 这个别名将vendor/library.a命名为一个新的库foo
  • 当另一个目标使用foo时,它还将更新其包含路径。
  • 然后使用foo的代码将能够#include "foo.h",并且文件将被找到,因为vendor已经添加到包含路径中。

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

我目前的做法是这样的:

代码语言:javascript
复制
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的消费者来说,拥有其他目标要容易得多。

代码语言:javascript
复制
target_link_libraries     (foo ${CMAKE_CURRENT_LIST_DIR}/vendor/library.a)
target_compile_options    (foo PUBLIC ...)
target_include_directories(foo PUBLIC ...)

问题:

  • 我是否可以创建一个新的库目标,它由一个预先构建的库组成,它将允许我完成我所描述的事情。

编辑回复评论:

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

代码语言:javascript
复制
add_library(foo STATIC IMPORTED)
set_property(TARGET foo PROPERTY IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/vendor/library.a)

但是,当我尝试设置包含目录时,我会得到一个错误:

代码语言:javascript
复制
target_include_directories(foo SYSTEM PUBLIC "${CMAKE_CURRENT_LIST_DIR}/vendor")

错误:

供应商/CMakeLists.txt:39 (target_include_directories):无法指定导入目标"foo“的包含目录时发生的CMake错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-22 17:00:38

  1. 您需要导入一个预先构建的库。这里是如何做到这一点的教程。
  2. 要使结果目标“完成”,需要向其添加某些属性。不幸的是,由于这个CMake问题,使用通常的技术无法做到这一点。因此,您必须手动设置这些道具,如这样的质量保证中所描述的
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36799017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档