在 cmake 中设置依赖接口的好处 target_link_libraries
benefits for setting dependency interface in cmake target_link_libraries
我在我的C++项目中使用了一段时间的CMake,我的项目是一个由多个子模块组成的应用程序(不是库),其中每个模块都依赖于同一个项目中的其他内部模块,并且依赖于多个还有第三方库,每个库都是使用 CMake 构建的。
目前,在指定这些依赖项时,我们在 target_link_libraries
中使用 PUBLIC
。我读了一些关于这个主题的 articles/documentations [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)
是否被视为 PRIVATE
或 PUBLIC
取决于您是否在其他地方使用可见性说明符 在 CMakeLists.txt。这种仅通过添加 不同的 库来改变库可见性的风险应该是任何人只需要使用 maintainer-recommended 最佳实践的全部理由。
有太多 public 依赖关系最终会导致毫无意义的长 link 行,这确实会膨胀 link 次,因为 linker 需要确定符号不相关。更糟糕的是,一个不需要 public 的库可能会 win 符号冲突不正确并造成麻烦。根本没有理由故意设置不准确的依赖模型。
最后,对于可执行文件,使用哪个可见性说明符通常很容易选择:99% 的情况下,它将是 PRIVATE
。然而,情况并非总是。如果你正在构建一个插件系统,比如说,你可能在你的可执行文件上设置了 ENABLE_EXPORTS
。在这种情况下,库实际上可能 link 到可执行目标并且可见性再次变得相关。
我在我的C++项目中使用了一段时间的CMake,我的项目是一个由多个子模块组成的应用程序(不是库),其中每个模块都依赖于同一个项目中的其他内部模块,并且依赖于多个还有第三方库,每个库都是使用 CMake 构建的。
目前,在指定这些依赖项时,我们在 target_link_libraries
中使用 PUBLIC
。我读了一些关于这个主题的 articles/documentations [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)
是否被视为 PRIVATE
或 PUBLIC
取决于您是否在其他地方使用可见性说明符 在 CMakeLists.txt。这种仅通过添加 不同的 库来改变库可见性的风险应该是任何人只需要使用 maintainer-recommended 最佳实践的全部理由。
有太多 public 依赖关系最终会导致毫无意义的长 link 行,这确实会膨胀 link 次,因为 linker 需要确定符号不相关。更糟糕的是,一个不需要 public 的库可能会 win 符号冲突不正确并造成麻烦。根本没有理由故意设置不准确的依赖模型。
最后,对于可执行文件,使用哪个可见性说明符通常很容易选择:99% 的情况下,它将是 PRIVATE
。然而,情况并非总是。如果你正在构建一个插件系统,比如说,你可能在你的可执行文件上设置了 ENABLE_EXPORTS
。在这种情况下,库实际上可能 link 到可执行目标并且可见性再次变得相关。