Saya mencoba membuat proyek sederhana di CLion. Ini menggunakan CMake (saya baru di sini) untuk menghasilkan Makefiles untuk membangun proyek (atau semacamnya)
Yang saya perlukan hanyalah mentransfer beberapa file non-proyek (semacam file sumber daya) ke direktori biner setiap kali saya menjalankan kode saya.
File tersebut berisi data uji dan aplikasi membukanya untuk membacanya. Saya mencoba beberapa cara untuk melakukannya:
Melalui
file(COPY ...
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/input.txt DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/input.txt
Terlihat bagus tetapi berfungsi hanya sekali dan tidak menyalin ulang file setelah proses berikutnya.
Melalui
add_custom_command
OUTPUT
Versi: kapanadd_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/input.txt COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/input.txt ${CMAKE_CURRENT_BINARY_DIR}/input.txt)
TARGET
Versi: kapanadd_custom_target(foo) add_custom_command( TARGET foo COMMAND ${CMAKE_COMMAND} copy ${CMAKE_CURRENT_BINARY_DIR}/test/input.txt ${CMAKE_SOURCE_DIR})
Tapi tidak ada yang berhasil.
Apa yang saya lakukan salah?
configure_file
ini tidak akan berfungsi dengan sub-direktori, meskipun Anda menggunakan GLOB untuk membuat daftar file.kedua opsi tersebut valid dan menargetkan dua langkah berbeda dari build Anda:
file(COPY ...
menyalin file pada langkah konfigurasi dan hanya pada langkah ini. Ketika Anda membangun kembali proyek Anda tanpa mengubah konfigurasi cmake Anda, perintah ini tidak akan dijalankan.add_custom_command
adalah pilihan yang lebih disukai ketika Anda ingin menyalin file pada setiap langkah pembuatan.Versi yang tepat untuk tugas Anda adalah:
Anda dapat memilih antara
PRE_BUILD
,PRE_LINK
,POST_BUILD
yang terbaik adalah Anda membaca dokumentasi add_custom_commandcontoh tentang cara menggunakan versi pertama dapat ditemukan di sini: Gunakan CMake add_custom_command untuk menghasilkan sumber untuk target lain
sumber
CMAKE_CURRENT_SOURCE_DIR
jikatest/input.txt
file tersebut relatif terhadapCMakeLists.txt
file saat ini . Jika itu relatif terhadap rootCMakeLists.txt
, maka gunakanCMAKE_SOURCE_DIR
.Opsi pertama yang Anda coba tidak berfungsi karena dua alasan.
Pertama, Anda lupa menutup tanda kurung.
Kedua,
DESTINATION
harus berupa direktori, bukan nama file. Dengan asumsi Anda menutup tanda kurung, file tersebut akan berakhir di folder bernamainput.txt
.Untuk membuatnya berhasil, ubah saja menjadi
sumber
Saya akan menyarankan
TARGET_FILE_DIR
jika Anda ingin file tersebut disalin ke folder yang sama dengan file .exe Anda.Di VS, skrip cmake ini akan menyalin input.txt ke file yang sama dengan exe akhir Anda, tidak peduli itu debug atau rilis.
sumber
Inilah yang saya gunakan untuk menyalin beberapa file sumber daya: file salinan adalah target kosong untuk mengabaikan kesalahan
sumber
add_dependencies(MainTarget copy-files)
untuk membuatnya berjalan secara otomatis ketika saya membangun MainTargetadd_dependencies(MainTarget copy-files)
rootCMakeLists.txt
berarti ini dapat digunakan di seluruh proyek.jika Anda ingin menyalin folder dari direktori saat ini ke folder biner (folder build)
maka syntexe-nya adalah:
sumber
Configur_file yang disarankan mungkin merupakan solusi termudah. Namun, itu tidak akan menjalankan kembali perintah salin jika Anda menghapus file secara manual dari direktori build. Untuk menangani kasus ini juga, berikut ini berfungsi untuk saya:
sumber