Jak zrobić wyjście CMake do katalogu „bin”?

187

Obecnie buduję projekt ze strukturą wtyczek. Używam CMake do kompilacji projektu. Wtyczki są kompilowane w osobnych katalogach. Mój problem polega na tym, że CMake kompiluje i zapisuje pliki binarne i wtyczki, biblioteki dynamiczne, w strukturze katalogów źródła. Jak zmusić CMake do zapisywania plików w katalogu typu ./bin ?

Martin Kristiansen
źródło

Odpowiedzi:

301

Podobnie jak w odpowiedzi Olega, uważam, że poprawna zmienna to CMAKE_RUNTIME_OUTPUT_DIRECTORY . W naszym głównym pliku CMakeLists.txt używamy:

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)

Możesz także określić katalogi wyjściowe dla poszczególnych celów:

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

W obu przypadkach można dołączyć _[CONFIG]do nazwy zmiennej / nieruchomość, aby katalog wyjściowy stosuje się do konkretnej konfiguracji (standardowe wartości dla konfiguracji są DEBUG, RELEASE, MINSIZERELi RELWITHDEBINFO).

Adam Bowen
źródło
8
Możesz to również zastąpić dla poszczególnych celów, ustawiając właściwość docelową RUNTIME_OUTPUT_DIRECTORY. Zobacz dokumentację tutaj: cmake.org/cmake/help/…
DLRdave
4
Link DLRdave nie działa. Spróbuj cmake.org/cmake/help/v2.8.8/…
Nicu Stiurca
Jak sprawić, by dotyczyło wszystkich konfiguracji jednocześnie?
emlai
Pierwsze trzy polecenia powinny mieć zastosowanie do wszystkich konfiguracji (w szczególności ustawienia CMAKE_RUNTIME_OUTPUT_DIRECTORY). Ustawiłbyś CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG (na przykład) tylko jeśli chciałbyś mieć inny katalog do wyjścia z debugowania. Dokładne zachowanie zależy od używanego generatora / zestawu narzędzi (na przykład pliki projektu Visual Studio zawierają wszystkie konfiguracje w jednym drzewie kompilacji, podczas gdy generator makefile generuje makefile tylko dla jednej konfiguracji kompilacji).
Adam Bowen
1
Jaki jest cel tego ustawienia CMAKE_ARCHIVE_OUTPUT_DIRECTORY, biorąc pod uwagę, że polecenie install(TARGETS <target_name>)wciąż narzeka na „nie podano RUNTIME DESTINATION dla wykonywalnego celu”? Ta zmienna rzekomo podaje wartość domyślną, dlatego installkomenda nie powinna narzekać na brak a RUNTIME DESTINATION.
thiagowfx
30

Posługiwać się set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "/some/full/path/to/bin")

ovk
źródło
10
Użyj pełnej nazwy ścieżki do katalogu jako wartości zmiennej i nie umieszczaj końcowego „/” w wartości ... jak w odpowiedzi Adama Bowena.
DLRdave
4
Dlaczego musisz dodać pełną ścieżkę? Wydaje się to być irytujące, gdy przenosisz swój projekt ...
ScottF
8

Użyj EXECUTABLE_OUTPUT_PATHzmiennej CMake, aby ustawić potrzebną ścieżkę. Szczegółowe informacje można znaleźć w dokumentacji online CMake:

CMake 2.8.8 Dokumentacja

gtikok
źródło
15
EXECUTABLE_OUTPUT_PATH nadal działa teraz, ale jest „starym” sposobem na osiągnięcie tego wyniku. Odpowiedź Adama Bowena jest zalecanym podejściem.
DLRdave
4

Jeśli chodzi o mnie, używam cmake 3.5, poniższe ( set variable) nie działa:

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

ale to działa ( 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
źródło
2
Używam odpowiedzi Adama z setem (CMAKE _... i działa, ale tylko wtedy, gdy robisz to przed dodaniem bibliotek, plików wykonywalnych itp.) Myślę, że jest to ważna uwaga dla początkujących takich jak ja.
ashrasmun
Łał. @ashrasmun uratowało mnie od szaleństwa po kilku godzinach. Absolutnie nic nie działało, dopóki nie uświadomiliśmy sobie, że kolejność tych poleceń jest bardzo istotna.
stawonogi
2
$ cat CMakeLists.txt
project (hello)
set(EXECUTABLE_OUTPUT_PATH "bin")
add_executable (hello hello.c)
Mcandre
źródło
1

Angielski nie jest moim językiem ojczystym; przepraszam za błędy w pisaniu.

użyj tej konfiguracji linii:
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build/)
umieść dowolny projekt CMakeLists.txt.
ten $ {PROJECT_SOURCE_DIR} to twój aktualny katalog źródłowy, w którym znajduje się projekt.
a jeśli zastanowisz się, dlaczego $ {EXECUTABLE_OUTPUT_PATH}
sprawdź ten plik, CMakeCache.txta następnie wyszukaj słowo kluczowe output path,
wszystkie zmienne tutaj zdefiniowane, to da pełne wyjaśnienie projektu setting·

jdir.s
źródło
0
cat CMakeLists.txt
project (hello)
set(CMAKE_BINARY_DIR "/bin")
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR})
add_executable (hello hello.c)
Poznaj Modię
źródło
8
Czy możesz dodać jakieś wyjaśnienie do swojej odpowiedzi?
Paul Floyd
0

Niezależnie od tego, czy zdefiniuję to w głównym pliku CMakeLists.txt, czy w poszczególnych, nadal zakłada się, że chcę wszystkich bibliotek i binów zejść z głównej ścieżki, co jest najmniej użytecznym założeniem ze wszystkich.

Jerry Miller
źródło
0

Aby dodać do tego:

Jeśli używasz CMAKE do generowania rozwiązania Visual Studio i chcesz, aby Visual Studio wyświetlał skompilowane pliki w katalogu / bin, odpowiedź Petera musi zostać nieco zmodyfikowana:

# 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
źródło