cmake构建在源目录中,而不是PWD

cmake构建在源目录中,而不是PWD,cmake,Cmake,问题 表明 cd ~/codebase mkdir Release cd Release cmake -DCMAKE_BUILD_TYPE=Release .. make 将在发布版中创建Makefile,并在那里构建二进制文件。中间.o文件将位于该文件的子目录中 然而,当我对我的项目执行此操作时,CMake忽略了它开始的PWD。最后一个目标始终是目录~/codebase/,其中包含CMakeList.txt。 在CMAKEGUI工具中,我将源目录和构建目录指定为同一目录,FQN指定为代码库

问题 表明

cd ~/codebase
mkdir Release
cd Release
cmake -DCMAKE_BUILD_TYPE=Release ..
make
将在发布版中创建Makefile,并在那里构建二进制文件。中间.o文件将位于该文件的子目录中

然而,当我对我的项目执行此操作时,CMake忽略了它开始的PWD。最后一个目标始终是目录
~/codebase/
,其中包含
CMakeList.txt
。 在CMAKEGUI工具中,我将源目录和构建目录指定为同一目录,FQN指定为代码库


我是CMake的新手,不知道如何让它像我期望的那样工作。如果您使用的是单个配置生成器(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)

如果你想知道为什么这是必要的,那是因为cmake不是一个构建系统。这是一个元构建系统(即创建构建系统的构建系统)。这基本上是处理在一个构建中支持多个配置的构建系统的结果。如果你想更深入地了解cmake,我建议你读一读克雷格·斯科特(Craig Scott)的《专业cmake:实用指南》(Professional cmake:a Practical Guide)一书中关于cmake的内容

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

编辑:
如果您使用的是单个配置生成器(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)

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

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

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

如果您希望您的生成位于子文件夹中,为什么要将源和生成指定到同一目录?“在cmake gui工具中,我将源和生成目录指定为同一目录”在gui中,您应该将源指向带有CMakeLists.txt的文件夹,并将生成指向另一个文件夹(不管它是子文件夹还是其他文件夹)。我还想进行调试生成,在我的命令中将
Release
替换为
Debug
。我不想将Release子目录硬连接到cmakcache.txt文件中。对于每个调试和发布版本,您需要有一个不同的文件夹。。。调试文件夹和发布文件夹中都会有一个CMakeCache.txt文件。如果希望生成位于子文件夹中,为什么要将源和生成指定到同一目录?“在cmake gui工具中,我将源和生成目录指定为同一目录”在gui中,您应该将源指向带有CMakeLists.txt的文件夹,并将生成指向另一个文件夹(不管它是子文件夹还是其他文件夹)。我还想进行调试生成,在我的命令中将
Release
替换为
Debug
。我不想将Release子目录硬连接到cmakcache.txt文件中。对于每个调试和发布版本,您需要有一个不同的文件夹。。。调试和发布文件夹中都会有一个cmakcache.txt文件。
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\u C\u COMPILER=clang-D cmake\u CXX\u COMPILER=clang++-D cmake\u build\u TYPE=RelWithDebInfo../。&&使VERBOSE=1
s/a构建系统,构建系统的构建系统/构建系统生成器/
谢谢,我已经让它工作了。最后,我做了
set-e&&mkdir-p build/release&&cd build/release&&cmake-G“Unix Makefiles”-D cmake\u C\u COMPILER=clang-D cmake\u CXX\u COMPILER=clang++-D cmake\u build\u TYPE=RelWithDebInfo../。&&使VERBOSE=1