target_link_libraries和add_dependencies

时间:2014-12-03 22:33:30

标签: cmake

是否有任何用例

target_link_libraries(my-lib x y z)

add_dependencies(my-lib x) # this is not just a waste of bytes?

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

3 个答案:

答案 0 :(得分:23)

在当前的CMake版本中:

在对add_dependencies进行一些错误检查后会调用Target->AddUtility()x已添加到my-lib的{​​{3}}列表中。

target_link_libraries不会调用AddUtility,但会将参数添加到utilities目标属性中。

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

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

答案 1 :(得分:2)

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

从概念的角度来看 - 我认为你是对的,这是浪费字节

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

根据文档target_link_libraries,add_dependencies概念在意识形态上被分割。 这种分离依赖关系和链接器选项的想法也在GNU make tool

中以Makefile格式保留

target_link_libraries

  

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

add_dependencies

  

...使顶层依赖其他顶级目标来确保   他们之前建立的......

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

add_library(fooLib 1.cpp 2.cpp)
add_library(my::fooLib ALIAS fooLib)
...
target_link_libraries(fooBin my::fooLib)

答案 2 :(得分:-1)

用于顶级目标相互依赖的情况。也就是说,如果 x 是你添加到项目中的东西(在顶层)

add_library( x x.c y.c z.c )

你应该告诉CMake。您可以使用 add_dependencies

来实现