target_link_libraries和add_dependencies

And*_*rus 16 cmake

是否有任何用例

target_link_libraries(my-lib x y z)

add_dependencies(my-lib x) # this is not just a waste of bytes?
Run Code Online (Sandbox Code Playgroud)

如果是这样,有人可以解释它会是什么吗?

ste*_*ire 23

在当前的CMake版本中:

经过一些错误检查后add_dependencies调用结果Target->AddUtility().x被添加到列表中的实用程序进行my-lib.

target_link_libraries不会导致调用AddUtility,但它会将参数添加到LINK_LIBRARIEStarget属性.

稍后,LINK_LIBRARIES目标属性的内容和实用程序列表都用于计算目标的依赖关系cmComputeTargetDepends.

在配置时无法查询目标中的实用程序列表,并且仅在生成时使用,因此使用add_dependencies带有已添加的库的参数target_link_libraries是多余的.


bru*_*iuz 5

我不知道你对什么特别感兴趣......

从概念的角度来看——我认为你是对的。这是一种字节的浪费。

从 CMake 文档的角度来看——您应该更喜欢make so 以保证正确的构建顺序。

根据文档 target_link_libraries,add_dependencies 概念在意识形态上是分裂的。GNU make工具中的 Makefile 格式也保留了这种拆分依赖项和链接器选项的想法。

target_link_libraries

..指定链接给定目标时要使用的库或标志。

add_dependencies

...使顶级 <target> 依赖于其他顶级目标,以确保它们在 <target> 之前构建...

在 3.* 的现代 CMake 中,如果您将执行与别名目标的链接,则可以省略 add_dependencies

add_library(fooLib 1.cpp 2.cpp)
add_library(my::fooLib ALIAS fooLib)
...
target_link_libraries(fooBin my::fooLib)
Run Code Online (Sandbox Code Playgroud)