通常使用find_package来将外部库包含在cmake项目中。
但是在大型的多应用程序/多库项目中,某些第三方和/或系统库通常由多个应用程序和库使用。
这些通用库的find_package应该在哪里调用?
第一个选项似乎是一种更具模块化的方法,但是为使用它们的每个库/ exe执行关联的find_package脚本。这会减慢配置步骤。
第二种方法更有效,但对我来说有点像全局变量。
答案 0 :(得分:2)
我将区分可能是独立软件包(或已经是独立软件包)的子项目/目录,还是专门反映源代码结构的子项目/目录。
在第一种情况下,find_package
应该清楚地位于子目录CMakeLists.txt
中,以允许提取该子目录以进行独立构建或分发。配置步骤的效率低在这里不应该引起关注,因为构建的配置并不经常执行。
在第二种情况下,我希望在顶级find_pacakge
中进行CMakeLists.txt
调用。如果您不使用这些调用设置的变量来填充全局变量,而是使用target_link_libraries
(如注释中所建议),则这应该足够干净。但是有时发现的包不会导出要链接的适当目标,而是定义一些包含路径变量等。然后,定义自己的INTERFACE
库应该很容易,该库将这些标志/路径封装为使用要求,并在再次通过target_link_libraries
链接时以传递方式传播它们。