Як зробити так, щоб CMake виводив у "bin" dir?


187

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

Відповіді:


301

Як і у відповіді Олега, я вважаю, що правильною змінною для встановлення є 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/…
Nicu Stiurca

Як змусити його застосуватись до всіх конфігурацій одночасно?
emlai

Перші три команди повинні застосовуватися до всіх конфігурацій (зокрема встановлення CMAKE_RUNTIME_OUTPUT_DIRECTORY). Ви б встановили CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG (наприклад), лише якщо ви хочете отримати інший каталог для виводу налагодження. Точна поведінка залежить від генератора / ланцюжка інструментів, який ви використовуєте (наприклад, файли проектів Visual Studio включають усі конфігурації в одному дереві збірки, тоді як генератор makefile генерує лише файли для однієї конфігурації збірки).
Адам Боуен

1
Яка мета встановлення CMAKE_ARCHIVE_OUTPUT_DIRECTORY, враховуючи, що команда install(TARGETS <target_name>)все ще скаржиться на "дане не RUNTIME DESTINATION для виконуваної цілі"? Ця змінна нібито забезпечує значення за замовчуванням, тому installкоманда не повинна скаржитися на відсутність а 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 Документація


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/"
)

2
Я використовую відповідь Адама з набором (CMAKE _..., і він працює, але лише тоді, коли ви це робите, перш ніж додавати бібліотеки, виконувані файли тощо. Я думаю, що це важлива примітка для початківців, як я.
ashrasmun

Ого. @ashrasmun врятував мене від божевілля через кілька годин. Абсолютно нічого не працювало, поки не зрозумів, що порядок цих команд дуже актуальний.
членистоногий

2
$ cat CMakeLists.txt
project (hello)
set(EXECUTABLE_OUTPUT_PATH "bin")
add_executable (hello hello.c)

1

Англійська мова не є моєю рідною мовою; пробачте про помилки введення тексту.

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



0

Незалежно від того, визначаю я це в головному CMakeLists.txt або в окремих, він все одно передбачає, що я хочу, щоб усі лінзи та біни були від головного шляху, що є найменш корисним припущенням із усіх.


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 )
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.