c++ - cmake:创建一个新的库目标,其中包含一个预构建的库

标签 c++ boost cmake

我正在尝试在 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".

最佳答案

  1. 您需要导入一个预构建的库。 here是如何操作的教程。
  2. 要使结果目标“完整”,您需要向其添加某些属性。不幸的是,这不能使用通常的技术来完成,因为 this CMake issue .所以你必须手动设置这些 Prop ,如 this SO QA 中所述。

关于c++ - cmake:创建一个新的库目标,其中包含一个预构建的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36799017/

相关文章:

unicode - 如何在 Windows 上设置 taglib 字符集以使用 unicode?

c++ - gmock : check only one element of vector

c++ - Boost 编译在 ubuntu 服务器 14.04 上失败

具有值语义且没有分配器恶作剧的 C++ 数组?

visual-studio - cmake Visual Studio项目子集

c++ - 如何在 Eclipse 中使用 nix

c++ - move 代码与复制代码相同时的规则 5?

c++ - 如何使用Qt Creator调试C++项目?

c++ - 如何在 map 中找到上一个和下一个键/值?

c++ - 在处理程序中排队请求时,从多个线程或一个线程调用boost asio io_service.run