cmake如何判断target_link_libraries项是库名还是目标?

How cmake judging target_link_libraries item is a library name or a target?

我在 cmake target_link_libraries 函数中遇到了一些麻烦。 在我的例子中,有三个这样的项目,这意味着A依赖于B,B依赖于C

A(exec) --> B(static library) --> C(static library alias C::C)

我这样给B写了一个CMakeLists.txt:

find_package(C REUQIRED)
add_library(B ...)
target_link_libraries(B PRIVATE C::C)

并且运行良好,编译成功。 A的cmake文件是这样的:

find_package(B REQUIRED)
add_exectuable(A ...)
target_link_libraries(A B)

链接A时报错,cmake设置一个链接器标志“-lC::C”,然后ld说C::C不存在。 它是怎么发生的?我认为 C::C 是一个目标,A 应该知道它,但是 cmake 认为它是一个库 name.And 我认为 A 不应该知道 B 依赖于 C,它是一个私有库。

我不想在A的cmake中写find_packge(C),因为C是一个静态库,我认为B应该处理C的所有依赖,对吗?

所以有人知道如何解决吗?

我终于解决了这个问题。 在我的例子中,B在模板代码中使用了C的函数,并且B没有实例化这个模板,所以C::C不会link进入B的静态library.ButA会实例化B的模板,所以A需要C::C,这就是B的PRIVATE标志没用的原因。

为了帮助A找到C::C,我应该在B的config.cmake中使用find_depecncy(C),让A在使用[时知道B的依赖关系=22=](B).