在 CMakeLists.txt 中应该在哪里调用 find_package?

Dal*_*mer 6 cmake

在 cmake 项目中包含外部库通常使用find_package().

但是在一个大型的多应用程序/多库项目中,一些 3rd 方和/或系统库被多个应用程序和库使用是很典型的。

应该在哪里find_package()调用这些公共库?

  1. CMakeLists.txt每个需要它们的可执行文件/库的文件中?
  2. 或者,一次在顶级CMakeLists.txt文件中?

第一个选项似乎是一种更模块化的方法,但是find_package()为使用它们的每个库/可执行文件执行关联的脚本。这会减慢配置步骤。

第二个选项更有效,但对我来说看起来有点像全局变量。

lub*_*bgr 2

我会区分可能是(或已经是)独立包的子项目/目录和那些专门反映源代码结构的子项目/目录。

  • 在第一种情况下,find_package显然应该位于子目录中CMakeLists.txt,以允许提取子目录以进行独立构建或分发。配置步骤的低效率不应该成为这里关注的问题,因为构建的配置并不经常执行。

  • 在第二种情况下,我更喜欢find_package在 toplevel 中调用CMakeLists.txt。如果您不使用这些调用设置的变量来填充全局变量,而是使用这些调用设置的变量target_link_libraries(如注释中建议的那样),那么这应该足够干净。但有时,找到的包不会导出正确的目标来链接,而是定义一些包含路径变量等。然后,应该很容易定义自己的INTERFACE库,将这些标志/路径封装为使用要求,并在再次链接时传递它们target_link_libraries