cmake 对于库目标,add_dependencies和target_link_libraries有什么区别?

guz6ccqo  于 2023-08-05  发布在  其他
关注(0)|答案(2)|浏览(184)

在CMake中,以下两者有什么区别:

add_dependencies(tgt1 tgt2)

字符串
和/或

target_link_libraries(tgt1 tgt2)


tgt2是库目标时?
注意:我不是指实现上的差异,我指的是语义上的差异。

2ic8powd

2ic8powd1#

add_dependencies只是使第二个目标的构建在第一个目标之前更新,如果两个目标都需要更新的话。这是一种构建顺序控制机制。
target_link_libraries使第二个目标成为第一个目标的链接依赖项-它们将由生成的buildsystem链接-并使其成为如果依赖的目标需要重建,则第一个目标也将在需要时重建。当使用PRIVATE或PUBLIC可见性时,它表示并指示第二个目标的接口中的内容将对第一个目标可用。当使用INTERFACE或PUBLIC visibility时,它表示并指示第二个目标的接口中的内容将可用于表达对第一个目标的链接依赖关系(“传递”链接依赖关系)的目标。

hm2xizp9

hm2xizp92#

add_dependencies(A B)确保生成的项目在构建A之前确保B是最新的。这相当于将以下规则添加到makefile中

A: B

字符串
target_link_libraries(A B)具有相同的效果加上:

  • 添加适当的链接器标志,以便在为A生成二进制文件时将为B生成的二进制文件包含在所链接的文件中
  • B的几个INTERFACE属性对A有效。其中许多对应于cmake命令,您可以将INTERFACE/PUBLIC传递到,例如。
  • target_compile_definitions
  • target_compile_features
  • target_compile_options
  • target_include_directories
  • target_link_directories
  • target_link_libraries
  • target_link_options
  • target_precompile_headers
  • target_sources
  • 如果A是一个库,并且您正在添加PUBLIC/INTERFACE作为可见性,则链接A的目标将以类似的方式访问INTERFACE属性
  • 一些附加的链接器选项可以被修改指定,例如用于设置rpath
  • install(EXPORT)install(TARGETS)的行为可能会略有变化。(导出依赖项信息,rpath更新。)
  • ALINK_LIBRARIES目标属性已更改
  • ...

相关问题