Как мне сделать вывод CMake в директорию bin?

188

Я в настоящее время строю проект со структурой плагина. Я использую CMake для компиляции проекта. Плагины скомпилированы в отдельных каталогах. Моя проблема в том, что CMake компилирует и сохраняет двоичные файлы и плагины, динамические библиотеки, в структуре каталогов исходного кода. Как сделать так, чтобы CMake сохранял файлы в директории ./bin ?

Мартин Кристиансен
источник

Ответы:

302

Как и в ответе Олега, я считаю, что правильная переменная для установки - CMAKE_RUNTIME_OUTPUT_DIRECTORY . Мы используем следующее в нашем корне CMakeLists.txt:

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

Вы также можете указать выходные каталоги для каждой цели:

set_target_properties( targets...
    PROPERTIES
    ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
    LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
)

В обоих случаях вы можете добавить _[CONFIG]к имени переменной / свойств , чтобы сделать выходной каталог применить к конфигурации конкретной (стандартные значения для конфигурации являются DEBUG, RELEASE, MINSIZERELи RELWITHDEBINFO).

Адам Боуэн
источник
8
Вы также можете переопределить это для каждой цели, установив целевое свойство RUNTIME_OUTPUT_DIRECTORY. См. Документацию здесь: cmake.org/cmake/help/…
DLRdave
4
Ссылка DLRdave мертва. Попробуйте cmake.org/cmake/help/v2.8.8/…
Нику Стиурка
Как сделать так, чтобы он применялся ко всем конфигурациям одновременно?
Эмлай
Первые три команды должны применяться ко всем конфигурациям (в частности, настройка CMAKE_RUNTIME_OUTPUT_DIRECTORY). Например, вы могли бы установить CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG (например), если бы вы хотели другой каталог для вывода отладки. Точное поведение зависит от используемого генератора / цепочки инструментов (например, файлы проекта Visual Studio включают все конфигурации в одном дереве сборки, в то время как генератор make-файлов будет генерировать файлы сборки только для одной конфигурации сборки).
Адам Боуэн
1
Какова цель установки CMAKE_ARCHIVE_OUTPUT_DIRECTORY, учитывая, что команда по- install(TARGETS <target_name>)прежнему жалуется на то, что «не назначено RUNTIME DESTINATION для исполняемой цели»? Эта переменная предположительно предоставляет значение по умолчанию, поэтому installкоманда не должна жаловаться на отсутствие a RUNTIME DESTINATION.
thiagowfx
30

использование set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "/some/full/path/to/bin")

ОВК
источник
10
Используйте полное имя пути к каталогу в качестве значения переменной и не ставьте завершающий символ "/" в значении ... как в ответе Адама Боуэна.
DLRdave
4
Зачем вам нужно добавить полный путь? Это кажется раздражением, когда вы перемещаете свой проект ...
ScottF
8

Используйте EXECUTABLE_OUTPUT_PATHпеременную CMake, чтобы установить нужный путь. За подробностями обращайтесь к онлайн-документации CMake:

CMake 2.8.8 Документация

gtikok
источник
15
EXECUTABLE_OUTPUT_PATH все еще работает прямо сейчас, но это «старый» способ достижения этого результата. Ответ Адама Боуэна - рекомендуемый подход.
DLRdave
4

Что касается меня, я использую cmake 3.5, ниже ( set variable) не работает:

set(
      ARCHIVE_OUTPUT_DIRECTORY "/home/xy/cmake_practice/lib/"
      LIBRARY_OUTPUT_DIRECTORY "/home/xy/cmake_practice/lib/"
      RUNTIME_OUTPUT_DIRECTORY "/home/xy/cmake_practice/bin/"
)

но это работает ( set set_target_properties):

set_target_properties(demo5
    PROPERTIES
    ARCHIVE_OUTPUT_DIRECTORY "/home/xy/cmake_practice/lib/"
    LIBRARY_OUTPUT_DIRECTORY "/home/xy/cmake_practice/lib/"
    RUNTIME_OUTPUT_DIRECTORY "/home/xy/cmake_practice/bin/"
)
Jayhello
источник
2
Я использую ответ Адама с множеством (CMAKE _... и он работает, но только когда вы делаете это перед добавлением библиотек, исполняемых файлов и т. Д. Я думаю, что это важное примечание для начинающих, таких как я.
ashrasmun
Вот это да. @ashrasmun спас меня от безумия через несколько часов. Абсолютно ничего не работало, пока не пришло осознание того, что порядок этих команд очень актуален.
членистоногие
2
$ cat CMakeLists.txt
project (hello)
set(EXECUTABLE_OUTPUT_PATH "bin")
add_executable (hello hello.c)
mcandre
источник
1

Английский не мой родной язык; пожалуйста, извините за ошибки при печати.

используйте эту строку config:
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build/)
поместите любой ваш проект CMakeLists.txt.
this $ {PROJECT_SOURCE_DIR} - это ваш текущий каталог исходных текстов, в котором находится проект.
и если бродить, почему $ {EXECUTABLE_OUTPUT_PATH}
проверяют этот файл, CMakeCache.txtто ищут ключевое слово output path,
все переменные, определенные здесь, дадут полное объяснение всего проекта setting·

jdir.s
источник
0
cat CMakeLists.txt
project (hello)
set(CMAKE_BINARY_DIR "/bin")
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR})
add_executable (hello hello.c)
Познакомьтесь с Модией
источник
8
Не могли бы вы добавить некоторые объяснения к вашему ответу?
Пол Флойд
0

Независимо от того, определяю ли я это в основном CMakeLists.txt или в отдельных файлах, все равно предполагается, что я хочу, чтобы все libs и bin были вне основного пути, что является наименее полезным предположением из всех.

Джерри Миллер
источник
0

Чтобы добавить к этому:

Если вы используете CMAKE для генерации решения Visual Studio и хотите, чтобы Visual Studio выводил скомпилированные файлы в / bin, ответ Питера нужно немного изменить:

# set output directories for all builds (Debug, Release, etc.)
foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} )
    string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG )
    set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_SOURCE_DIR}/lib )
    set( CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_SOURCE_DIR}/lib )
    set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_SOURCE_DIR}/bin )
endforeach( OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES )
serg06
источник