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

时间:2018-07-12 06:10:42

标签: c++ cmake

通常使用find_package来将外部库包含在cmake项目中。

但是在大​​型的多应用程序/多库项目中,某些第三方和/或系统库通常由多个应用程序和库使用。

这些通用库的find_package应该在哪里调用?

  1. 每个需要它们的exe /库的CMakeLists.txt文件中?
  2. 还是在顶级CMakeLists.txt文件中保存一次?

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

第二种方法更有效,但对我来说有点像全局变量。

1 个答案:

答案 0 :(得分:2)

我将区分可能是独立软件包(或已经是独立软件包)的子项目/目录,还是专门反映源代码结构的子项目/目录。

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

  • 在第二种情况下,我希望在顶级find_pacakge中进行CMakeLists.txt调用。如果您不使用这些调用设置的变量来填充全局变量,而是使用target_link_libraries(如注释中所建议),则这应该足够干净。但是有时发现的包不会导出要链接的适当目标,而是定义一些包含路径变量等。然后,定义自己的INTERFACE库应该很容易,该库将这些标志/路径封装为使用要求,并在再次通过target_link_libraries链接时以传递方式传播它们。