Bagaimana cara membuat output CMake menjadi direktori 'bin'?


187

Saat ini saya sedang membangun sebuah proyek dengan struktur plugin. Saya menggunakan CMake untuk mengkompilasi proyek. Plugin dikompilasi dalam direktori terpisah. Masalah saya adalah bahwa CMake mengkompilasi dan menyimpan binari dan plugin, pustaka dinamis, dalam struktur direktori sumber. Bagaimana cara membuat CMake menyimpan file dalam sesuatu seperti direktori ./bin ?

Jawaban:


301

Seperti dalam jawaban Oleg, saya percaya variabel yang benar untuk ditetapkan adalah CMAKE_RUNTIME_OUTPUT_DIRECTORY . Kami menggunakan yang berikut ini di root CMakeLists.txt kami:

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)

Anda juga dapat menentukan direktori keluaran berdasarkan per target:

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

Dalam kedua kasus, Anda dapat menambahkan _[CONFIG]untuk nama variabel / properti untuk membuat direktori keluaran berlaku untuk konfigurasi tertentu (nilai standar untuk konfigurasi yang DEBUG, RELEASE, MINSIZERELdan RELWITHDEBINFO).


8
Anda juga dapat menimpanya pada basis per target dengan menetapkan properti target RUNTIME_OUTPUT_DIRECTORY. Lihat dokumentasi di sini: cmake.org/cmake/help/…
DLRdave

4
Tautan DLRdave sudah mati. Coba cmake.org/cmake/help/v2.8.8/…
Nicu Stiurca

Bagaimana cara membuatnya berlaku untuk semua konfigurasi sekaligus?
emlai

Tiga perintah pertama harus berlaku untuk semua konfigurasi (khusus mengatur CMAKE_RUNTIME_OUTPUT_DIRECTORY). Anda hanya akan menetapkan CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG (misalnya) jika Anda menginginkan direktori lain untuk hasil debug. Perilaku yang tepat tergantung pada generator / toolchain yang Anda gunakan (misalnya file proyek Visual Studio menyertakan semua konfigurasi dalam satu build tree, sementara generator makefile hanya akan menghasilkan makefile untuk konfigurasi one build).
Adam Bowen

1
Apa tujuan dari pengaturan CMAKE_ARCHIVE_OUTPUT_DIRECTORY, mengingat bahwa perintah install(TARGETS <target_name>)masih mengeluh tentang "tidak diberikan RUNTIME DESTINATION untuk target yang dapat dieksekusi"? Variabel ini seharusnya memberikan nilai default, oleh karena itu installperintah tidak boleh mengeluh tentang tidak adanya a RUNTIME DESTINATION.
thiagowfx

30

Menggunakan set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "/some/full/path/to/bin")


10
Gunakan nama path lengkap ke direktori sebagai nilai variabel, dan jangan beri tanda "/" pada nilai ... seperti dalam jawaban Adam Bowen.
DLRdave

4
Mengapa Anda perlu menambahkan path lengkap? Tampaknya seperti gangguan ketika Anda memindahkan proyek Anda ...
ScottF

8

Gunakan EXECUTABLE_OUTPUT_PATHvariabel CMake untuk mengatur jalur yang diperlukan. Untuk detail, lihat dokumentasi CMake online:

CMake 2.8.8 Dokumentasi


15
EXECUTABLE_OUTPUT_PATH masih berfungsi saat ini, tetapi merupakan cara "lama" untuk mencapai hasil ini. Jawaban Adam Bowen adalah pendekatan yang direkomendasikan.
DLRdave

4

Bagi saya saya menggunakan cmake 3.5, di bawah ini ( set variable) tidak berfungsi:

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

tetapi ini berhasil ( 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
Saya menggunakan jawaban Adam dengan set (CMAKE _... dan berfungsi, tetapi hanya ketika Anda melakukannya sebelum menambahkan perpustakaan, executables dll. Saya pikir ini adalah catatan penting bagi pemula seperti saya.
ashrasmun

Wow. @ashrasmun menyelamatkan saya dari menjadi gila setelah beberapa jam. Sama sekali tidak ada yang bekerja sampai menyadari bahwa urutan perintah ini sangat relevan.
arthropoda

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

1

Bahasa Inggris bukan bahasa ibu saya; mohon alasan kesalahan pengetikan.

gunakan konfigurasi baris ini:
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build/)
tempatkan proyek CMakeLists.txt Anda.
$ {PROJECT_SOURCE_DIR} ini adalah direktori sumber Anda saat ini tempat proyek.
dan jika berkelana mengapa $ {EXECUTABLE_OUTPUT_PATH}
periksa file ini CMakeCache.txtkemudian cari kata kunci output path,
semua variabel yang didefinisikan di sini, itu akan memberikan penjelasan lengkap tentang proyek semua 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
Bisakah Anda menambahkan beberapa penjelasan untuk jawaban Anda?
Paul Floyd

0

Terlepas dari apakah saya mendefinisikan ini di CMakeLists.txt utama atau yang individual, masih mengasumsikan saya ingin semua lib dan sampah dari jalur utama, yang merupakan asumsi yang paling tidak berguna dari semua.


0

Untuk menambahkan ini:

Jika Anda menggunakan CMAKE untuk menghasilkan solusi Visual Studio , dan Anda ingin Visual Studio mengeluarkan file yang dikompilasi ke / bin, jawaban Peter perlu sedikit dimodifikasi:

# 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 )
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.