在cmake targetlinkbraries中设置依赖接口的好处



我在C++项目中使用了CMake一段时间,我的项目是一个由多个子模块组成的应用程序(而不是库(,其中每个模块都依赖于同一项目中的其他内部模块,也依赖于多个第三方库,每个库都是使用CMake构建的。

目前,在指定这些依赖关系时,我们在target_link_libraries中使用PUBLIC。我阅读了一些关于这个主题的文章/文档[1][2][3],知道PUBLIC/INTERFACE/PRIVATE之间的一般区别,并且知道建议尽可能详细地指定不同的可见性。但由于我正在构建一个应用程序而不是一个库,所以我并不担心内部API是";"泄漏";不小心,我们应该选择使用像PRIVATE这样的非PUBLIC可见性,还有其他好处吗?例如,它除了影响链接的速度之外,还会影响编译速度吗?如果链接不需要太多时间,那么通过探索这个选项来优化编译速度是否仍然有意义?它最终会影响二进制文件的大小吗?或者控制这种行为还有其他好处吗?谢谢

[1]https://cmake.org/cmake/help/latest/command/target_link_libraries.html[2]https://leimao.github.io/blog/CMake-Public-Private-Interface/[3]https://cmake.org/pipermail/cmake/2016-May/063400.html

您应该绝对始终target_link_libraries中使用可见性说明符

默认情况下,target_link_libraries(target lib)是否被视为PRIVATEPUBLIC取决于您是否在CMakeLists.txt中的其他处使用可见性说明符。通过添加不同的库来更改库的可见性的风险应该是任何人只需使用维护人员推荐的最佳实践所需要的所有理由。

有太多的公共依赖关系最终会导致无意义的长链接线,这确实会增加链接时间,因为链接器需要确定符号不相关。更糟糕的是,一个不需要公开的库可能会错误地赢得符号冲突并引发麻烦。根本没有理由故意建立一个不准确的依赖关系模型。

最后,对于可执行文件,使用哪个可见性说明符通常很容易选择:99%的情况下,它将是PRIVATE。然而,情况并非总是如此。如果你正在构建一个插件系统,比如说,你可能在你的可执行文件上设置了ENABLE_EXPORTS。在这种情况下,库实际上可能链接到可执行目标,并且可见性再次变得相关。

最新更新