c++ - CMAKE 在子目录之间共享变量

标签 c++ cmake

我正在尝试从 foo(见下文)访问一个在 bar 中计算的变量。我在 SO 上观察到的方法是将 CACHE INTERNAL 添加到 SET。它有效,但我必须两次调用 GNU Make 文件的生成。看起来第一次运行时变量不在缓存中,所以我只得到一个空值。

结构

CMakeList.txt (top)--
                    |
                    -- CMakeList.txt (foo)
                    |
                    -- CMakeList.txt (bar)

内容 顶CMakeList.txt

...
...
ADD_SUBDIRECTORY(foo)
ADD_SUBDIRECTORY(bar)
...
...

Foo CMakeList.txt

...
...
    TARGET_INCLUDE_DIRECTORIES(MyProject SYSTEM PRIVATE
        ${BarPath}
    )
    MESSAGE(STATUS "Bar include path " ${BarPath})
...
...

栏CMakeList.txt

...
...
SET(BarPath ${CMAKE_CURRENT_BINARY_DIR} CACHE INTERNAL "Path to generated files.")
...
...

然后当我运行 cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX= 时。 -G "CodeBlocks - Unix Makefiles" 来自 Foo 文件的 MESSAGE 返回空 BarPath。再次运行它,预期值将填充到变量中。怎么了?

最佳答案

Foo/CMakeLists.txtcmakeBar/CMakeLists.txt 之前执行。

当您第一次运行 cmake 时:

  1. ${BarPath} 未定义,Foo/CMakeLists.txt 将其打印为空。
  2. ${BarPath}Bar/CMakeLists.txt 定义和缓存。

第二次运行时:

  1. ${BarPath} 在缓存中被 Foo/CMakeLists.txt 打印出来。
  2. ${BarPath}Bar/CMakeLists.txt 重新定义和缓存。

关于c++ - CMAKE 在子目录之间共享变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52518430/

相关文章:

c++ - 在 C++ 中同时进行赋值和条件测试

c++ - 谷歌模拟无法模拟带有模板化参数的方法

c++ - 如何从 Rust 调用 C++ 动态库?

c++ - Qt中如何写字符串的switch语句?

opencv - CMake错误:CUDA_cublas_LIBRARY(高级)

带有数组的 C++ 构造函数初始化列表

cmake - Yocto/OE : recipe with CMake install a shared library . 所以

c++ - 调试时 Visual Studio 跳过(和移动)断点 (C++/CMake)

c++ - CMake RelWithDebInfo 链接到调试库

c++ - 从对象库构建的 CMake 链接共享库