我正在使用现代cmake(即具有适当的目标和属性)编写一个库(我们称之为 mylib )。直到我遇到第3方依赖(让我们称之为 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)
现在,当我尝试从可执行文件链接 mylib 时(让我们称之为 myexec ),我收到以下错误:
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 的公共依赖关系)。但是,加载MyLibConfig.cmake
时, myexec 无法使用此模块。
现在的问题是,这个问题的最佳解决方案是什么?我看到的一个想法是使用 mylib 安装FindFoo.cmake
并在运行CMAKE_MODULE_PATH
时将其添加到MyLibConfig.cmake
,总线这对我来说似乎不对。如何为用户提供可传递的目标?