是否可以 link 一个 cmake 项目到子项目?
Is it possible to link a cmake project to subprojects?
我有一个 C++ 库项目,它带有一个 examples
文件夹。这些示例是独立的,即它们可以在没有源代码树的其余部分的情况下进行编译,就好像它们是使用该库的真实应用程序一样。他们使用提供的 FindMyLib.cmake
在系统中查找已安装的库。
我希望也能够将它们与整个库一起构建。最初,我将它们添加为子目录:
if(MYLIB_BUILD_EXAMPLES)
add_subdirectory(examples/fooexample)
add_subdirectory(examples/barexample)
endif()
但是这是行不通的,因为在安装库之前我不能使用find_package
。我可以将默认构建目录添加到搜索路径,但这还不够,因为库尚未构建,而 cmake 是 运行(很明显)。
我该怎么做才能解决这个问题?有没有一种方法可以在构建这些子项目时透明地 link 库(以及 "disable" find_package,因为如果不安装它肯定会失败)。
只需准备 fake FindMyLib.cmake
,它使用 build 树链接到库,而不是 安装一个。例如,它可以将变量 MyLib_LIBRARY
变量设置为库 target:
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()
我有一个 C++ 库项目,它带有一个 examples
文件夹。这些示例是独立的,即它们可以在没有源代码树的其余部分的情况下进行编译,就好像它们是使用该库的真实应用程序一样。他们使用提供的 FindMyLib.cmake
在系统中查找已安装的库。
我希望也能够将它们与整个库一起构建。最初,我将它们添加为子目录:
if(MYLIB_BUILD_EXAMPLES)
add_subdirectory(examples/fooexample)
add_subdirectory(examples/barexample)
endif()
但是这是行不通的,因为在安装库之前我不能使用find_package
。我可以将默认构建目录添加到搜索路径,但这还不够,因为库尚未构建,而 cmake 是 运行(很明显)。
我该怎么做才能解决这个问题?有没有一种方法可以在构建这些子项目时透明地 link 库(以及 "disable" find_package,因为如果不安装它肯定会失败)。
只需准备 fake FindMyLib.cmake
,它使用 build 树链接到库,而不是 安装一个。例如,它可以将变量 MyLib_LIBRARY
变量设置为库 target:
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()