chapter11.a - 对比 export 和 install 命令

exportinstall 命令都有 TARGETSEXPORT 两种参数形式,所以容易混淆:

export (TARGETS ...)
  将给定的 targets 导出到 target export file,不会创建 named export

install(TARGETS ... [EXPORT] ...)
  如果有 EXPORT,除了安装之外,还会顺便从 targets 创建 named export(有两个作用!!这个是我是检查了 cmake_install.cmake 的)

export (EXPORT  ...)
  将 named export 导出到文件,可以指定名字空间

install(EXPORT  ...)
  将 named export 安装到系统,和 export(EXPORT ...) 有相似的参数,同样可以指定名字空间

export 命令用来导出 target export file。install 命令用来安装文件到系统。在 target export file 的场景下,两者都能用于“安装”,但是前者一般是用在安装在临时路径上(参考 Exporting without installation),而后者是用来安装进系统的。

例子:unnamed export VS named export

# unnamed export
export(TARGETS calc
       FILE "${EXPORT_DIR}/CalcTargets.cmake"
       NAMESPACE Calc::
)

#[=[
named export,同时还有 install(TARGETS calc) 的副作用。因而代码相当于:
install(TARGETS calc)
export(TARGETS calc
       FILE "${EXPORT_DIR}/CalcTargets2.cmake"
       NAMESPACE Calc::
)
#]=]
install(TARGETS calc EXPORT CalcTargets)
export(EXPORT CalcTargets
       FILE "${EXPORT_DIR}/CalcTargets2.cmake"
       NAMESPACE Calc::
)

这样生成的两个 target export file 的内容是一模一样的。