Cmake 从库中传播可传递目标的最佳实践?

Cmake 从库中传播可传递目标的最佳实践?,cmake,Cmake,我目前正在使用现代cmake(即具有适当的目标和属性)编写一个库(我们称之为mylib)。这一切都很好,直到我遇到一个第三方依赖项(我们称之为libfoo),它没有在其FooConfig.cmake中定义导入的目标 为此,我决定编写自己的自定义FindFoo.cmake模块,在其中我自己定义依赖项的目标Foo::Foo。这对于构建mylib很好,但在尝试链接可执行文件时失败(安装后) 下面是MyLibConfig.cmake的简化版本: include(CMakeFindDependencyMa

我目前正在使用现代cmake(即具有适当的目标和属性)编写一个库(我们称之为mylib)。这一切都很好,直到我遇到一个第三方依赖项(我们称之为libfoo),它没有在其
FooConfig.cmake
中定义导入的目标

为此,我决定编写自己的自定义
FindFoo.cmake
模块,在其中我自己定义依赖项的目标
Foo::Foo
。这对于构建mylib很好,但在尝试链接可执行文件时失败(安装后)

下面是MyLibConfig.cmake的简化版本:

include(CMakeFindDependencyMacro)
find_dependency(Foo 1.0 REQUIRED)
include(${CMAKE_CURRENT_LIST_DIR}/MyLibTargets.cmake)
现在,当我尝试从一个可执行文件(我们称之为myexec)链接mylib时,我得到以下错误:

Target "myexec" links to target "Foo::Foo" but the target was
not found.  Perhaps a find_package() call is missing for an IMPORTED
target, or an ALIAS target is missing?
我理解为什么会发生这种情况:目标
Foo::Foo
是在我的自定义
FindFoo.cmake
模块中定义的(它是mylib的公共依赖项)。但是,当myexec加载
MyLibConfig.cmake
时,该模块不可用于myexec


现在的问题是,这个问题的最佳解决方案是什么?我看到的一个想法是用mylib安装
FindFoo.cmake
,并在运行
MyLibConfig.cmake
时将其添加到
cmake\u模块路径中,这对我来说似乎是错误的。我如何让可传递的目标对用户可用?

如果库中没有
FindFoo.cmake
,您希望库的用户如何找到它的
Foo::Foo
依赖项?请注意,
MyLibConfig.cmake
是在安装库之后使用的,并且只有已安装的文件可用。@Tsyvarev:问题是,如何使用
FindFoo.cmake
?将其安装到某个目录中(可能与
MyLibConfig.cmake
相同),并将此目录添加到
MyLibConfig.cmake
中的
cmake\u模块路径中,效果很好,但看起来不是很优雅。我的意思是,无论如何都应该安装
FindFoo.cmake
。因为您(您的项目)是该文件的提供者,所以您应该安装它。至于更好地选择文件应该安装的目录。。。我不知道。在我看来,将此文件放在
MyLibConfig.cmake
附近并不坏。