【问题标题】:cmake building in source directory, not PWDcmake 在源目录中构建,而不是 PWD
【发布时间】:2021-02-19 06:54:00
【问题描述】:

问题 Debug vs Release in CMake 表示

cd ~/codebase
mkdir Release
cd Release
cmake -DCMAKE_BUILD_TYPE=Release ..
make

将在release 中创建 Makefile,并在那里构建二进制文件。中间 .o 文件将位于 this 的子目录中。

但是,当我对我的项目执行此操作时,CMake 会忽略启动它的 PWD。最终目标始终是包含CMakeList.txt 的目录~/codebase/。 在 cmake-gui 工具中,我将源目录和构建目录指定为同一目录,FQN 到代码库

我是 CMake 的新手,不知道如何让它按我的预期工作。我应该修改什么才能按预期完成这项工作?

【问题讨论】:

  • 如果你希望你的构建在一个子文件夹中,你为什么要指定源和构建到同一个目录? “在cmake-gui工具中,我指定source和build目录是同一个目录” 在gui中,你应该将source指向带有CMakeLists.txt的文件夹,并将build指向不同的文件夹(没关系如果它是一个子文件夹或者它在其他地方的单独文件夹中)。
  • 我还想通过在我的命令中将 Release 替换为 Debug 来进行调试构建。我不想将 Release 子目录硬连线到 cmakecache.txt 文件中
  • 你需要为每个调试和发布版本有一个不同的文件夹...在调试和发布文件夹中都会有一个 CMakeCache.txt 文件。

标签: cmake


【解决方案1】:

如果您使用单个配置生成器(Ninja/Unix-Makefiles)

那么你需要为每个配置创建一个构建文件夹。

像这样:

# Configure the build
cmake -S . -B build/Debug -D CMAKE_BUILD_TYPE=Release

# Actually build the binaries
cmake --build build/Debug

对于多配置生成器,它略有不同(Ninja Multi-Config,Visual Studio)

# Configure the build
cmake -S . -B build

# Actually build the binaries
cmake --build build --config Debug

如果您想知道为什么这是必要的,那是因为 cmake 不是构建系统。它是一个元构建系统(即创建构建系统的构建系统)。这基本上是处理在 1 个构建中支持多种配置的构建系统的结果。如果您想更深入地了解,我建议您阅读 Craig Scott 的《Professional CMake: A Practical Guide》一书中有关 cmake 的一些内容

注意: 我的示例使用较新的 cmake cli 实践。

编辑: 您链接到的那个问题的答案已经过时了……

【讨论】:

  • s/a build system that build's build systems/a build system generator/
  • 谢谢,我已经搞定了。最后我做了set -e && mkdir -p build/release && cd build/release && cmake -G "Unix Makefiles" -D CMAKE_C_COMPILER=clang -D CMAKE_CXX_COMPILER=clang++ -D CMAKE_BUILD_TYPE=RelWithDebInfo ../.. && make VERBOSE=1
猜你喜欢
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多