CMake çıktısını 'bin' dizinine nasıl gönderirim?


187

Şu anda eklenti yapısına sahip bir proje inşa ediyorum. Projeyi derlemek için CMake kullanıyorum. Eklentiler ayrı dizinlerde derlenir. Benim sorunum CMake ikili ve eklentileri, dinamik kütüphaneleri derlemek ve kaynağın dizin yapısında kaydeder olmasıdır. CMake'in dosyaları ./bin dizini gibi bir yere kaydetmesini nasıl sağlayabilirim ?

Yanıtlar:


301

Oleg'in cevabında olduğu gibi, ayarlanacak doğru değişkenin CMAKE_RUNTIME_OUTPUT_DIRECTORY olduğuna inanıyorum . Kök CMakeLists.txt dosyamızda aşağıdakileri kullanırız:

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)

Çıktı dizinlerini hedef başına da belirtebilirsiniz:

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

Her iki durumda da ekleyebilirsiniz _[CONFIG]çıktı dizini belirli bir yapılandırma (konfigürasyon için standart değerlerdir için geçerli olmak üzere, değişken / özellik adına DEBUG, RELEASE, MINSIZERELve RELWITHDEBINFO).


8
Ayrıca, RUNTIME_OUTPUT_DIRECTORY hedef özelliğini ayarlayarak hedef başına temelinde bunu geçersiz kılabilirsiniz. Buradaki belgelere bakın: cmake.org/cmake/help/…
DLRdave

4
DLRdave'in bağlantısı öldü. Deneyin cmake.org/cmake/help/v2.8.8/…
Nicu Stiurca

Tüm yapılandırmalar için aynı anda nasıl uygulanır?
emlai

İlk üç komut tüm yapılandırmalara uygulanmalıdır (özellikle CMAKE_RUNTIME_OUTPUT_DIRECTORY ayarı). CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG (örneğin) yalnızca hata ayıklama çıktısı için farklı bir dizin isteseydiniz ayarlarsınız. Tam davranış, kullandığınız oluşturucuya / araç zincirine bağlıdır (örneğin, Visual Studio proje dosyaları bir yapı ağacındaki tüm yapılandırmaları içerirken, makefile oluşturucusu yalnızca bir yapı yapılandırması için makefiles oluşturur).
Adam Bowen

1
CMAKE_ARCHIVE_OUTPUT_DIRECTORYKomutun install(TARGETS <target_name>)"çalıştırılabilir hedef için ÇALIŞMA HEDEFİ verilmediği" konusunda hala şikayet ettiğini düşünerek , ayarlamanın amacı nedir ? Bu değişkenin varsayılan bir değer sağladığı varsayılır, bu nedenle installkomut a'nın yokluğundan şikayet etmemelidir RUNTIME DESTINATION.
thiagowfx

30

kullanım set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "/some/full/path/to/bin")


10
Değişken değeri olarak dizinin tam yol adını kullanın ve Adam Bowen'ın yanıtında olduğu gibi ... değerine bir "/" işareti koymayın.
DLRdave

4
Neden tam yolu eklemeniz gerekiyor? Projenizi hareket ettirdiğinizde bir sıkıntı gibi görünüyor ...
ScottF

8

Kullanım EXECUTABLE_OUTPUT_PATHgerekli yolunu ayarlamak için CKağıt değişkeni. Ayrıntılar için çevrimiçi CMake belgelerine bakın:

CMake 2.8.8 Belgeleri


15
EXECUTABLE_OUTPUT_PATH şu anda çalışıyor, ancak bu sonuca ulaşmanın "eski" yolu. Adam Bowen'ın cevabı önerilen yaklaşımdır.
DLRdave

4

Bana gelince cmake 3.5 kullanıyorum, aşağıdaki ( set variable) çalışmıyor:

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

ancak bu işe yarar ( 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
Adam'ın cevabını setle kullanıyorum (CMAKE _... ve işe yarıyor, ancak sadece kütüphaneler, yürütülebilir dosyalar vb.
Eklemeden

Vay. @ashrasmun birkaç saat sonra beni delirmekten kurtardı. Bu komutların sırasının çok alakalı olduğunun farkına varıncaya kadar kesinlikle hiçbir şey işe yaramadı.
Eklem bacaklılar

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

1

İngilizce benim ana dilim değil; lütfen yazım hatalarını affedin.

Bu satır yapılandırmasını kullanın:
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build/)
herhangi bir CMakeLists.txt projenizi yerleştirin.
bu $ {PROJECT_SOURCE_DIR}, proje yerinizin geçerli kaynak dizininizdir.
ve dolaşmak neden $ {EXECUTABLE_OUTPUT_PATH} ise
bu dosyayı kontrol CMakeCache.txtedip anahtar kelimeyi arayın output path,
tüm değişkenler burada tanımlar, projenin tam bir açıklamasını verir. setting·


0
cat CMakeLists.txt
project (hello)
set(CMAKE_BINARY_DIR "/bin")
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR})
add_executable (hello hello.c)

8
Cevabınıza biraz açıklama ekleyebilir misiniz?
Paul Floyd

0

Bunu ana CMakeLists.txt dosyasında veya tek tek tanımlamamıza bakılmaksızın, yine de tüm kütüphaneleri ve çöp kutularını ana yoldan istediğimi varsayar ki bu da en az faydalı varsayımdır.


0

Buna eklemek için:

Bir Visual Studio çözümü oluşturmak için CMAKE kullanıyorsanız ve Visual Studio'nun derlenmiş dosyaları / bin'e vermesini istiyorsanız , Peter'ın cevabının biraz değiştirilmesi gerekir:

# 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 )
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.