据我了解INTERFACE图书馆就像 Visual Studio property sheets ,非常有用。我们可以使用它来链接静态库并传播属性。
但是IMPORTED目标困扰我:我看不到只能通过 IMPORTED 目标解决的问题。
最佳答案
当你创建一个导入的目标时,你是在告诉 CMake:我有这个 { 静态库 |共享库 |模块库 |可执行文件 } 已经建在磁盘上的这个位置。我希望能够像对待我自己的构建系统构建的目标一样对待它,所以请注意,当我说 ImportedTargetName
时,它应该引用磁盘上的二进制文件(如果适用,则使用相关的导入库,依此类推)。
当你创建一个接口(interface)库时,你是在告诉 CMake:我有一组客户可以使用的属性(包括目录等),所以如果他们“链接”到我的接口(interface)库,请将这些属性传播给他们。
根本区别在于接口(interface)库不受磁盘上任何东西的支持,它们只是一组需求/属性。您可以设置INTERFACE_LINK_LIBRARIES
如果您真的想要,可以在接口(interface)库上使用属性,但这并不是它们的真正设计目的。它们用于封装客户端可使用的属性,并且主要适用于 C++ 中的仅 header 库之类的东西。
另请注意,接口(interface)库是一个库——没有接口(interface)可执行文件之类的东西,但您确实可以导入可执行文件。例如。 Bison 的包配置文件可以为 Bison 可执行文件定义一个导入的目标,然后您的项目可以将其用于自定义命令:
# In Bison package config file:
add_executable(Bison IMPORTED)
set_property(TARGET Bison PROPERTY IMPORTED_LOCATION ...)
# In your project:
find_package(Bison)
add_custom_command(
OUTPUT parser.c
COMMAND Bison tab.y -o parser.c
DEPENDS tab.y
...
)
(Bison 仅用作您可能希望在自定义命令中使用的示例,命令行可能不适合它)。
关于cmake - IMPORTED 目标库和 INTERFACE 库之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36648375/