C ++中的库链接,三个库之间的依赖

时间:2020-03-18 15:18:26

标签: c++ cmake dependencies circular-dependency

对于某人来说,这可能是一个奇怪/初学者的问题。但是我有以下情况。

在我的代码中,我正在创建三个库,比如说 A B C 。在库B中,我正在链接库A,所以类似target_link_libraries(... A)

我的C库正在与B链接。所以我有: B -> A C -> B

那么我是否有可能使用方法来枚举库A和C中定义的内容?虽然C没有显式链接A?我使用的是在库A的A::someClass::someEnum中定义的枚举,它会编译并显示正确的值条目。

2 个答案:

答案 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中的函数或变量的定义。理论上,库可以具有循环链接依赖项(这意味着您需要链接反对整个圆圈,或者完全没有圆圈)。

相关问题