是否可以将 cmake 项目链接到子项目

Is it possible to link a cmake project to subprojects?

本文关键字:链接 子项目 项目 cmake 是否      更新时间:2023-10-16

我有一个带有examples文件夹的C++库项目。这些示例是独立的,即它们可以在没有源代码树的其余部分的情况下进行编译,就好像它们是使用该库的真实应用程序一样。他们使用提供的FindMyLib.cmake在系统中查找已安装的库。

我也希望能够与整个库一起构建它们。最初,我将它们添加为子目录:

if(MYLIB_BUILD_EXAMPLES)
    add_subdirectory(examples/fooexample)
    add_subdirectory(examples/barexample)
endif()

但这行不通,因为在安装库之前我无法使用find_package。我可以将默认构建目录添加到搜索路径中,但这还不够,因为在 cmake 运行时尚未构建库(显然)。

我能做些什么来解决这个问题?有没有办法在构建库时透明地将库链接到这些子项目(并且还"禁用"find_package,因为它在没有安装的情况下必然会失败)。

只需准备FindMyLib.cmake,它使用构建树链接到库,而不是安装树。 例如,它可以将变量MyLib_LIBRARY变量设置为库目标

cmake-build/FindMyLib.cmake

set(MyLib_LIBRARY MyLib)
set(MyLib_INCLUDE_DIRECTORIES ${CMAKE_SOURCE_DIR}/include)
...

然后在列表中CMAKE_MODULE_PATH前面加上目录,其中包含假脚本。这样,它将通过示例使用:

if(MYLIB_BUILD_EXAMPLES)
    set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake-build ${CMAKE_MODULE_PATH})
    add_subdirectory(examples/fooexample)
    add_subdirectory(examples/barexample)
endif()

在您的示例中,一种解决方案可能是检查构建MyLib的目标是否存在,如果存在,则将其用作依赖项; 否则调用find_library()

add_library(MyLib ...)
# examples/fooexample
if(NOT TARGET MyLib)
  find_library(MyLib)
endif()
add_executable(foo)
if(TARGET MyLib)
  add_dependencies(foo MyLib)
endif()