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>...]
[DESCRIPTION <project-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>)
为包 <PackageName>
将当前构建目录存储在 CMake 用户包注册表中。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
控制。指定要配置的包依赖项。这会改变
find_dependency()
调用在export(EXPORT)
和install(EXPORT)
期间的写入方式。<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
是否存在,如果存在,则将其用作导入位置,而不是已安装的库。