cmake - IMPORTED 目标库和 INTERFACE 库之间有什么区别?

标签 cmake

据我了解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/

相关文章:

c++ - 如何在 project.pro 中调用带有源代码的嵌套文件夹中的文件?

unix - 在安装时使用 CMake 创建指向库的自定义符号链接(symbolic link)

linker - CMake : FIND_LIBRARY problem

c++ - 在 Windows 上使用 CMake 设置 Vulkan 项目

cmake - 将二进制文件放在 CMake 的何处?

visual-c++ - 如何将clang-tidy与CMake(<LANG> _CLANG_TIDY)和MSVC集成?

visual-studio - Visual Studio Express 2012 和 cmake

c++ - 如何在 Clion 和 CMake 中添加 allegro 库?

macos - CMake在带有brew的OS X上找不到Boost

android-studio - 在Android Studio中添加对CMake项目的引用