如何使cmake输出到“ build”目录?

时间:2018-08-26 02:25:19

标签: c++ cmake

我正在使用cmake编译C ++项目,并且我希望cmake生成Makefile文件夹中的所有输出文件(用于创建二进制文件的元文件,例如build之类的元文件)。我检查了How do I make cmake output into a 'bin' dir?中的所有答案,但没有一个对我有用(令人惊讶!)。文件是在根文件夹而不是build文件夹中生成的,这是怎么回事?我想我一定错过了什么。

代码结构

➜  cmake-test tree .
.
├── CMakeLists.txt
└── hello.cpp

0 directories, 2 files

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)

构建命令和输出

➜  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

cmake版本

➜  cmake-test cmake --version

cmake version 3.11.4

CMake suite maintained and supported by Kitware (kitware.com/cmake).

操作系统

Linux

3 个答案:

答案 0 :(得分:8)

执行此操作的通常方法是更改​​输出目录,然后从该目录运行cmake,而不是更改变量来设置路径。因此,通常没有cmake .或类似的字符。

我理解最初的冲动说:“但是我希望我的构建系统将输出写入其他位置。”但是通常不像您最初期望的那样使用CMake,并且运行您的CMake构建的其他人不会期望您的期望,因此最好使用内置的默认行为,即运行cmake ..的任何地方的输出。

采用另一种方式:您正在与该工具作战。不要那样做。

答案 1 :(得分:4)

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

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

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

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

cmake -Hpath/to/source -Bpath/to/build

甚至是源目录中的

cmake . -Bbuild

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

答案 2 :(得分:0)

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

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

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

cmake -S src -B build