【发布时间】: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". -
谢谢!!如果您想将其放入答案中,我很乐意接受