如何将cmake输出到"build"目录?

Sea*_*ene 5 c++ cmake

我正在使用cmake来编译C++项目,我希望cmake生成文件夹Makefile中的所有输出文件(用于创建二进制文件的元文件)build.我已经检查了如何将cmake输出变成'bin'目录中的所有答案,他们都没有为我工作(令人惊讶!).文件是在根文件夹而不是在build文件夹中生成的,这里有什么问题?我想我一定错过了什么.

代码结构

?  cmake-test tree .
.
??? CMakeLists.txt
??? hello.cpp

0 directories, 2 files
Run Code Online (Sandbox Code Playgroud)

的CMakeLists.txt

# Specify the minimum version for CMake
cmake_minimum_required(VERSION 3.11)

# Project's name
project(hello)

# Set the output folder where your program will be created
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/build)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/build)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

# The following folder will be included
include_directories("${PROJECT_SOURCE_DIR}")

add_executable(hello ${PROJECT_SOURCE_DIR}/hello.cpp)
Run Code Online (Sandbox Code Playgroud)

构建命令和输出

?  cmake-test cmake .

-- The C compiler identification is GNU 8.2.0
-- The CXX compiler identification is GNU 8.2.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/searene/CLionProjects/cmake-test

?  cmake-test ls

bin  CMakeCache.txt  CMakeFiles  cmake_install.cmake  CMakeLists.txt  hello.cpp  Makefile
Run Code Online (Sandbox Code Playgroud)

cmake版本

?  cmake-test cmake --version

cmake version 3.11.4

CMake suite maintained and supported by Kitware (kitware.com/cmake).
Run Code Online (Sandbox Code Playgroud)

OS

Linux的

Joh*_*nck 12

通常的方法是,而不是更改变量来设置路径,只需创建输出目录,更改它,然后从那里运行cmake.所以,而不是cmake .你通常有cmake ..或类似.

我理解最初的冲动说"但我希望我的构建系统能够在其他地方写出输出." 但是CMake通常不会以你最初期望的方式使用,而其他运行你的CMake构建的人也不会期望你期望的东西,所以最好只使用内置的默认行为,这就是放置cmake运行的地方输出.

换句话说:你正在与这个工具作斗争.不要那样做.


小智 8

CMake 3.19.1(不确定旧版本怎么样)有以下选项(来自文档):

cmake [<选项>] -S <源路径> -B <构建路径>

用作构建树和源树。指定的路径可以是绝对路径,也可以是相对于当前工作目录的相对路径。源树必须包含 CMakeLists.txt 文件。如果构建树尚不存在,则会自动创建。例如:

cmake -S src -B build
Run Code Online (Sandbox Code Playgroud)


pse*_*ert 7

免责声明:我建议使用@ john-zwinck的答案。

默认情况下,cmake使用当前工作目录作为构建目录,使用您提供的任何路径作为源目录。因此,实现目标的正常方法是

  • 创建构建目录(mkdir build
  • 去那里(cd build
  • 使用源目录作为参数(cmake path/to/source)调用cmake

但是据我所知,还有另一种方法在某些人使用的方法中,据我所知,cmake文档中没有记录,仅出于兼容性原因或内部使用而保留。在-B-H标志

cmake -Hpath/to/source -Bpath/to/build
Run Code Online (Sandbox Code Playgroud)

甚至从源目录

cmake . -Bbuild
Run Code Online (Sandbox Code Playgroud)

重要提示:之后没有空格-B