c++ - 是否可以将 cmake 项目链接到子项目?

标签 c++ cmake build-process

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

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

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

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

我可以做什么来解决这个问题?有没有一种方法可以在构建库时透明地将库链接到这些子项目(并且还“禁用”find_package,因为如果不安装它肯定会失败)。

最佳答案

只需准备fake 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()

关于c++ - 是否可以将 cmake 项目链接到子项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37719094/

相关文章:

linux - 强制 Bamboo 使用特定的构建代理进行部署

c++ - bool 自动转换为 nullptr_t

c++ - C++ 绿色线程的堆栈分配

c++ - 具有多个类的多个 dll 和 dll 中的全局变量

c++ - CMake add_executable() 使用 .cpp 文件还是 .hpp 文件?

visual-studio - 在没有 MSBuild 或插件的情况下在 Visual Studio 中按顺序构建配置?

c++ - 缺少类型说明符错误

c++ - 如何在 Windows 上备份 cmake gui 的生成器缓存/设置?

c++ - 如何在cmake中为cuda源代码添加定义

gradle - 添加对 gradle 任务组的依赖关系