对于某人来说,这可能是一个奇怪/初学者的问题。但是我有以下情况。
在我的代码中,我正在创建三个库,比如说 A , B 和 C 。在库B中,我正在链接库A,所以类似target_link_libraries(... A)
。
我的C库正在与B链接。所以我有:
B -> A
C -> B
。
那么我是否有可能使用方法来枚举库A和C中定义的内容?虽然C没有显式链接A?我使用的是在库A的A::someClass::someEnum
中定义的枚举,它会编译并显示正确的值条目。
答案 0 :(得分:1)
那么我有可能使用方法枚举库A中定义的内容还是C中的枚举吗?
您的C库是否使用这些方法/枚举/等。是通过库A还是库B中的包括标头?
如果C 直接包括库A的标头,则应将其与库A 明确链接:
# A is a private linkage of B.
target_link_libraries(B PRIVATE A)
# C needs to be linked with A
target_link_libraries(C B A)
如果C包含库B的标头,而库B的标头又包含库A的标头,则A库应该是B 接口的一部分:
# B links with A and this linkage is an interface of B
target_link_libraries(B PUBLIC A)
# C may link with B only
target_link_libraries(C B)
这些方法假定使用“现代”(目标面向)的CMake。但是使用这些方法将获得最具扩展性的解决方案。
答案 1 :(得分:0)
请记住,链接依赖和编译依赖不是同一回事。
很可能库C的源使用与库A关联的标头中的定义...,而与链接时C是否依赖于A无关。
现在,在CMake中,我们不仅使用target_link_libraries()
进行链接。此CMake命令确保库的标头可用于从属目标进行编译,并且其库可用于链接。
对于库C,也可能需要库A进行链接-具有库A中的函数或变量的定义。理论上,库可以具有循环链接依赖项(这意味着您需要链接反对整个圆圈,或者完全没有圆圈)。