在CMake中,如何在调用find_package后找到导入的目标?

In CMake, how can I find the imported target after calling find_package?

CMake find_package 文档说:

When the package is found package-specific information is provided through variables and Imported Targets documented by the package itself.

如果我有一个库,ABCD,我可以使用 find_package,只要 CMake 可以找到合适的 ABCDConfig.cmake 文件。然后如上所述创建导入目标(例如 abcd10 abcdExtra)。

然后我可以像这样针对这些库进行编译和link:

target_include_directories(mytarget abcd10 abcdExtra)
target_link_libraries(mytarget abcd10 abcdExtra)

问题是,根据其他人编写的 ABCDConfig.cmake 文件的内容,目标的名称几乎可以是任何内容(例如 abcdlibabcdX64 ,Foobar,...), 即使它可能是完全相同的库 ABCD!

我已经浏览了很多文档,但我看不到任何获取导入目标的方法,所以看起来我必须知道所有常见的导入目标名称是什么,并检查它们个别地。这对我来说似乎有点不合理。我在这里错过了什么吗?我如何在不知道这些细节的情况下加载和 link 针对不同包管理器(甚至编写自己的 ABCDConfig.cmake 文件的人)生成的库?

How can I load and link against libraries generated by different package managers (or even someone who wrote their own ABCDConfig.cmake file) without knowing these specifics?

你不能。

唯一的方法是阅读有关特定ABCDConfig.cmake 文件的文档。此类文档通常写在文件的开头(作为注释)。

CMake 不对 ABCDConfig.cmake 文件强制执行任何操作,因此只有文件的作者知道如何使用它。

虽然 CMake 为生成配置文件提供了一些支持(参见 install(EXPORTS) 命令),但只有项目作者知道导入目标的含义。