export¶
导出目标或包,供外部项目直接从当前项目的构建树中使用,无需安装。
请参阅 install(EXPORT) 命令,从安装树中导出目标。
概要¶
export(TARGETS <target>... [...]) export(EXPORT <export-name> [...]) export(PACKAGE <PackageName>) export(SETUP <export-name> [...])
导出目标¶
- export(TARGETS <target>... [...])¶
export(TARGETS <target>... [NAMESPACE <namespace>]
[APPEND] FILE <filename> [EXPORT_LINK_INTERFACE_LIBRARIES]
[CXX_MODULES_DIRECTORY <directory>])
创建一个文件 <filename>,外部项目可以包含该文件来从当前项目的构建树中导入由 <target>... 指定的目标。这在交叉编译时很有用,可以构建可以在一个项目的主机平台上运行的实用程序可执行文件,然后将它们导入到正在为目标平台编译的另一个项目中。
此命令创建的文件特定于构建树,不应安装。请参阅 install(EXPORT) 命令,从安装树中导出目标。
选项包括
NAMESPACE <namespace>将
<namespace>字符串添加到写入文件的所有目标名称之前。APPEND而是追加到文件,而不是覆盖它。这可用于将多个目标增量导出到同一文件。
EXPORT_LINK_INTERFACE_LIBRARIES在导出中包含以模式
(IMPORTED_)?LINK_INTERFACE_LIBRARIES(_<CONFIG>)?命名的属性的内容,即使在策略CMP0022为 NEW 时也是如此。这对于支持使用早于 2.8.12 的 CMake 版本的消费者很有用。CXX_MODULES_DIRECTORY <directory>版本 3.28 新增。
将 C++ 模块属性导出到给定目录下的文件中。每个文件的命名将根据目标的导出名称(不带任何命名空间)。这些文件将自动从导出文件中包含。
此签名要求显式列出所有目标。如果导出的库目标链接到另一个未包含的目标,则行为未定义。请参阅 export(EXPORT) 签名,以自动从构建树中导出与 install(EXPORT) 从安装树中导出的目标相同的目标。
注意
Xcode 生成器下的 对象库 在 CMAKE_OSX_ARCHITECTURES 中列出了多个架构时,会有特殊的处理。在这种情况下,它们将作为 接口库 导出,客户端无法使用对象文件。这足以满足链接到对象库实现的其他目标的传递使用要求。
此命令导出构建树中的所有 构建配置。有关将依赖项目的配置映射到导出的配置的信息,请参阅 CMAKE_MAP_IMPORTED_CONFIG_<CONFIG> 变量。
导出目标到 Android.mk¶
export(TARGETS <target>... ANDROID_MK <filename>)
3.7 版本中新增。
此签名通过创建一个引用预构建目标的 Android.mk 文件,将 CMake 构建的目标导出到 android ndk 构建系统。Android NDK 支持使用预构建库(静态和共享)。这使得 CMake 可以构建项目的库,并通过完整的传递依赖项、包含标志和定义,使它们可供 ndk 构建系统使用。该签名接受目标列表,并将它们放入由给定的 <filename> 指定的 Android.mk 文件中。此签名仅在所有给定目标的策略 CMP0022 为 NEW 时才能使用。如果一个目标的策略设置为 OLD,则会发出错误。
导出与 install(EXPORT) 匹配的目标¶
- export(EXPORT <export-name> [...])
export(EXPORT <export-name> [NAMESPACE <namespace>] [FILE <filename>]
[CXX_MODULES_DIRECTORY <directory>] [EXPORT_PACKAGE_DEPENDENCIES])
创建一个文件 <filename>,外部项目可以包含该文件以从当前项目的构建树中导入目标。这与 export(TARGETS) 签名相同,不同之处在于目标没有显式列出。相反,它导出了与安装导出 <export-name> 关联的目标。可以使用 install(TARGETS) 命令的 EXPORT 选项将目标安装与导出 <export-name> 关联。
EXPORT_PACKAGE_DEPENDENCIES注意
实验性。受
CMAKE_EXPERIMENTAL_EXPORT_PACKAGE_DEPENDENCIES控制。指定导出
find_dependency()调用。有关此工作原理的详细信息,请参阅install(EXPORT)。
导出目标到通用包规范¶
export(EXPORT <export-name> PACKAGE_INFO <package-name>
[PROJECT <project-name>|NO_PROJECT_METADATA]
[APPENDIX <appendix-name>]
[LOWER_CASE_FILE]
[VERSION <version>
[COMPAT_VERSION <version>]
[VERSION_SCHEMA <string>]]
[DEFAULT_TARGETS <target>...]
[DEFAULT_CONFIGURATIONS <config>...]
[LICENSE <license-string>]
[DEFAULT_LICENSE <license-string>]
[DESCRIPTION <description-string>]
[HOMEPAGE_URL <url-string>])
在 4.1 版本中新增。
注意
实验性。受 CMAKE_EXPERIMENTAL_EXPORT_PACKAGE_INFO 控制。
在 通用包规范 中创建一个文件,外部项目可以包含该文件以从当前项目的构建树中导入由 <target>... 指定的目标。请参阅 install(PACKAGE_INFO) 命令,从安装树中导出目标。导入的目标隐式位于 <package-name> 命名空间中。
默认文件名是 <package-name>[-<appendix-name>].cps。如果提供了 LOWER_CASE_FILE 选项,则文件名将使用转换为小写的包名。
有关其他选项的说明,请参阅 install(PACKAGE_INFO)。
导出包¶
- export(PACKAGE <PackageName>)¶
export(PACKAGE <PackageName>)
将当前构建目录存储在 CMake 用户包注册表中,用于包 <PackageName>。 find_package() 命令可能在搜索包 <PackageName> 时考虑该目录。这有助于依赖项目在没有用户帮助的情况下从当前项目的构建树中查找和使用包。请注意,此命令创建的包注册表条目仅与适用于构建树的包配置文件(<PackageName>Config.cmake)结合使用。在某些情况下,例如打包和系统范围的安装,不希望写入用户包注册表。
版本 3.1 中已更改:如果启用了 CMAKE_EXPORT_NO_PACKAGE_REGISTRY 变量,则 export(PACKAGE) 命令将不执行任何操作。
版本 3.15 中已更改:默认情况下,export(PACKAGE) 命令不执行任何操作(请参阅策略 CMP0090),因为填充用户包注册表具有超出源树和构建树的影响。设置 CMAKE_EXPORT_PACKAGE_REGISTRY 变量以将构建目录添加到 CMake 用户包注册表。
配置导出¶
- export(SETUP <export-name> [...])¶
export(SETUP <export-name>
[PACKAGE_DEPENDENCY <dep>
[ENABLED (<bool-true>|<bool-false>|AUTO)]
[EXTRA_ARGS <args>...]
] [...]
[TARGET <target>
[XCFRAMEWORK_LOCATION <location>]
] [...]
)
在版本 3.29 中添加。
配置导出的参数。参数如下:
PACKAGE_DEPENDENCY <dep>注意
实验性。受
CMAKE_EXPERIMENTAL_EXPORT_PACKAGE_DEPENDENCIES控制。指定要配置的包依赖项。这会更改在
export(EXPORT)和install(EXPORT)期间写入find_dependency()调用的方式。<dep>是要导出的包的名称。此参数接受以下附加参数:ENABLED手动控制是否导出依赖项。此项接受以下值:
<bool-true>CMake 识别为“true”的任何值。始终导出依赖项,即使没有导出的目标依赖于它。这可用于手动将
find_dependency()调用添加到导出中。<bool-false>CMake 识别为“false”的任何值。永远不要导出依赖项,即使导出的目标依赖于它。
AUTO仅当导出的目标依赖于该依赖项时,才导出该依赖项。
EXTRA_ARGS <args>指定在
REQUIRED参数之后传递给find_dependency()的其他参数。
TARGET <target>指定在此导出中配置的目标。此参数接受以下附加参数:
XCFRAMEWORK_LOCATION指定包含此目标库的
.xcframework的位置。如果指定,生成的代码将检查.xcframework是否存在,如果存在,它将使用.xcframework作为其导入位置,而不是已安装的库。