在CMake中,以下两者有什么区别:
add_dependencies(tgt1 tgt2)
字符串和/或
target_link_libraries(tgt1 tgt2)
型当tgt2是库目标时?注意:我不是指实现上的差异,我指的是语义上的差异。
tgt2
2ic8powd1#
add_dependencies只是使第二个目标的构建在第一个目标之前更新,如果两个目标都需要更新的话。这是一种构建顺序控制机制。target_link_libraries使第二个目标成为第一个目标的链接依赖项-它们将由生成的buildsystem链接-并使其成为如果依赖的目标需要重建,则第一个目标也将在需要时重建。当使用PRIVATE或PUBLIC可见性时,它表示并指示第二个目标的接口中的内容将对第一个目标可用。当使用INTERFACE或PUBLIC visibility时,它表示并指示第二个目标的接口中的内容将可用于表达对第一个目标的链接依赖关系(“传递”链接依赖关系)的目标。
add_dependencies
target_link_libraries
hm2xizp92#
add_dependencies(A B)确保生成的项目在构建A之前确保B是最新的。这相当于将以下规则添加到makefile中
add_dependencies(A B)
A
B
A: B
字符串target_link_libraries(A B)具有相同的效果加上:
target_link_libraries(A B)
INTERFACE
PUBLIC
target_compile_definitions
target_compile_features
target_compile_options
target_include_directories
target_link_directories
target_link_options
target_precompile_headers
target_sources
install(EXPORT)
install(TARGETS)
LINK_LIBRARIES
2条答案
按热度按时间2ic8powd1#
add_dependencies
只是使第二个目标的构建在第一个目标之前更新,如果两个目标都需要更新的话。这是一种构建顺序控制机制。target_link_libraries
使第二个目标成为第一个目标的链接依赖项-它们将由生成的buildsystem链接-并使其成为如果依赖的目标需要重建,则第一个目标也将在需要时重建。当使用PRIVATE或PUBLIC可见性时,它表示并指示第二个目标的接口中的内容将对第一个目标可用。当使用INTERFACE或PUBLIC visibility时,它表示并指示第二个目标的接口中的内容将可用于表达对第一个目标的链接依赖关系(“传递”链接依赖关系)的目标。hm2xizp92#
add_dependencies(A B)
确保生成的项目在构建A
之前确保B
是最新的。这相当于将以下规则添加到makefile中字符串
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
属性install(EXPORT)
和install(TARGETS)
的行为可能会略有变化。(导出依赖项信息,rpath更新。)A
的LINK_LIBRARIES
目标属性已更改