Я использую cmake для компиляции проекта C++ и хочу, чтобы cmake генерировал все выходные файлы (метафайлы, такие как Makefile, используемые для создания двоичных файлов) в папке build. Я проверил все ответы в Как мне превратить вывод cmake в каталог bin?, ни один из них у меня не работал (что удивительно!). Файлы создаются в корневой папке, а не в папке build, что здесь не так? Наверное, я что-то упустил.
➜ cmake-test tree .
.
├── CMakeLists.txt
└── hello.cpp
0 directories, 2 files
# 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-test cmake --version
cmake version 3.11.4
CMake suite maintained and supported by Kitware (kitware.com/cmake).
Linux
Обычный способ сделать это вместо изменения переменных для установки пути - просто создать выходной каталог, изменить его и запустить оттуда cmake. Так что вместо cmake . у вас обычно есть cmake .. или аналогичный.
@Alceste_ Я хочу, чтобы метафайлы находились в каталоге build, то есть те файлы, которые были созданы при запуске cmake ..
@JohnZwinck Да, это действительно сработало! Но я не хочу постоянно менять каталоги, я просто хочу запустить cmake . в корневом каталоге, а затем выходные файлы могут быть сгенерированы в папке build.
mkdir build && cd build && cmake .. где CMakeLists.txt остается в корневом каталоге.
Самый простой способ - это использовать псевдоним. :П
@Alceste_ Есть ли способ сделать это, не меняя каталоги? Я думал, что эти переменные в CMakeLists.txt должны это делать, но они не работали.





Обычный способ сделать это вместо изменения переменных для установки пути - просто создать выходной каталог, изменить его и запустить оттуда cmake. Так что вместо cmake . у вас обычно есть cmake .. или аналогичный.
Я понимаю первоначальный импульс, чтобы сказать: «Но я ожидаю, что моя система сборки напишет вывод где-то еще». Но CMake обычно не используется так, как вы изначально ожидали, и другие люди, которые запускают вашу сборку CMake, не ожидают того, чего вы ожидали, поэтому, вероятно, лучше всего просто использовать встроенное поведение по умолчанию, которое заключается в том, чтобы поставить вывод везде, где был запущен cmake.
Другими словами: вы боретесь против инструмента. Не делай этого.
Последняя часть - довольно важный момент, который мы слишком часто забываем. Если вам действительно нужно работать с поведением, описанным в вопросе, используйте псевдоним, чтобы вы не раздражали других людей, имея при этом идеальную среду для себя.
Спасибо, наконец-то понял. Я неправильно понял вопрос в stackoverflow.com/questions/6594796/…, я думал, что у нас один и тот же вопрос, но это не так. Он спрашивал расположение двоичных файлов, а я спрашивал расположение метафайлов, используемых для создания двоичных файлов. Неудивительно, что ни один из этих ответов у меня не сработал. Если это обычное поведение, я буду его придерживаться. Спасибо!
Отказ от ответственности: я рекомендую ответить @ john-zwinck.
По умолчанию cmake использует текущий рабочий каталог в качестве каталога сборки и любой путь, который вы указываете в качестве исходного каталога. Итак, нормальный способ достижения вашей цели -
mkdir build)cd build)cmake path/to/source)НО есть другой способ, насколько я знаю, не задокументированный в документации cmake и сохраненный только из соображений совместимости или внутреннего использования, который используют некоторые люди. Флаги -B и -H
cmake -Hpath/to/source -Bpath/to/build
или даже из исходного каталога
cmake . -Bbuild
Важно: нет места после -B.
CMake 3.19.1 (не уверен, как насчет более старых) имеет следующий вариант (из документов):
cmake [<параметры>] -S <путь-к-источнику> -B <путь-к-сборке>
Uses as the build tree and as the source tree. The specified paths may be absolute or relative to the current working directory. The source tree must contain a CMakeLists.txt file. The build tree will be created automatically if it does not already exist. For example:
cmake -S src -B build
Чтобы все были уверены, вы хотите, чтобы Cmake выводил двоичные файлы в сборку, когда вы устанавливаете cmake (копию), или вы хотите, чтобы двоичные файлы всегда выводились для сборки? Также сборка обычно используется для метафайлов сборки, а bin - для двоичных файлов. : 3