Saya akan menggunakan add_custom_command
untuk mencapai ini bersama cmake -E copy_if_different...
. Untuk menjalankan info lengkap
cmake --help-command add_custom_command
cmake -E
Jadi dalam kasus Anda, jika Anda memiliki struktur direktori berikut:
/CMakeLists.txt
/src
/libs/test.dll
dan target CMake Anda yang menerapkan perintah ini MyTest
, Anda dapat menambahkan yang berikut ini ke CMakeLists.txt:
add_custom_command(TARGET MyTest POST_BUILD # Adds a post-build event to MyTest
COMMAND ${CMAKE_COMMAND} -E copy_if_different # which executes "cmake - E copy_if_different..."
"${PROJECT_SOURCE_DIR}/libs/test.dll" # <--this is in-file
$<TARGET_FILE_DIR:MyTest>) # <--this is out-file path
Jika Anda hanya ingin seluruh konten /libs/
direktori disalin, gunakan cmake -E copy_directory
:
add_custom_command(TARGET MyTest POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${PROJECT_SOURCE_DIR}/libs"
$<TARGET_FILE_DIR:MyTest>)
Jika Anda perlu menyalin dll yang berbeda tergantung pada konfigurasinya (Rilis, Debug, misalnya) maka Anda dapat memilikinya di subdirektori yang diberi nama dengan konfigurasi yang sesuai:, /libs/Release
dan /libs/Debug
. Anda kemudian perlu memasukkan jenis konfigurasi ke jalur ke dll dalam add_custom_command
panggilan, seperti ini:
add_custom_command(TARGET MyTest POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${PROJECT_SOURCE_DIR}/libs/$<CONFIGURATION>"
$<TARGET_FILE_DIR:MyTest>)
${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$<CONFIG>
untuk tujuan target. Jika tidak, itu akan menyalinnya ke jalur build perpustakaan, yang tidak berguna.install()
arahan cmake untuk merakit binari? Atau mungkin membuatLIBRARY
sesuatu? Saya tidak terlalu tahu tentang rantai alat.$<TARGET_FILE_DIR:MyTest>
- apa itu? Cara mencetak info, apa sebenarnya maksudnyaIMPORTED_LIBRARIES
. Ia mengeluh tentang tidak dapat menjalankan perintah post-build ketika tidak ada yang dibangun.IMPORTED
perpustakaan, dan perlu merelokasi DLL, Anda perlu menggunakan perintah varian. Jika Anda telah menambahkanIMPORTED
perpustakaanMyImportedLib
Anda seperti yang akan Anda gunakanCOMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:MyImportedLib> $<TARGET_FILE_DIR:MyTest>
Perhatikan bahwa untuk menjalankan beberapa perintah post build Anda membutuhkan semuanya terikat ke dalam satu perintah khusus misalnyaadd_custom_command(TARGET MyTest POST_BUILD COMMAND #your first command# COMMAND #Your second command#)
Saya meletakkan baris-baris ini di file CMakeLists.txt tingkat atas saya. Semua pustaka dan file yang dapat dieksekusi yang dikompilasi oleh CMake akan ditempatkan di tingkat teratas dari direktori build sehingga file yang dapat dieksekusi dapat menemukan perpustakaan dan mudah untuk menjalankan semuanya.
Perhatikan bahwa ini tidak menyelesaikan masalah OP menyalin biner yang telah dikompilasi dari direktori sumber proyek.
sumber
Saya mengalami masalah ini hari ini ketika mencoba membuat Windows membangun program saya. Dan saya akhirnya melakukan penelitian sendiri karena semua jawaban ini tidak memuaskan saya. Ada tiga masalah utama:
Saya ingin build debug ditautkan dengan library versi debug dan build rilis masing-masing ditautkan dengan build rilis library.
Selain itu, saya ingin versi file DLL yang benar (Debug / Release) disalin ke direktori keluaran.
Dan saya ingin mencapai semua ini tanpa menulis skrip yang rumit dan rapuh.
Setelah menjelajahi beberapa manual CMake dan beberapa proyek multiplatform di github, saya menemukan solusi ini:
Deklarasikan perpustakaan Anda sebagai target dengan atribut "IMPORTED", rujuk file debug dan rilisnya .lib dan .dll.
Tautkan target ini dengan proyek Anda seperti biasa
Buat langkah custom build untuk menyalin file dll ke tujuannya jika sudah diubah sejak build sebelumnya
sumber
Tambahan untuk jawaban yang diterima, ditambahkan sebagai jawaban terpisah sehingga saya mendapatkan pemformatan kode:
Jika Anda membangun dll Anda dalam proyek yang sama, mereka biasanya berada di direktori Release, Debug, dll. Anda harus menggunakan variabel lingkungan Visual Studio untuk menyalinnya dengan benar. misalnya:
untuk sumber dan
untuk tujuan. Perhatikan pelariannya!
Anda tidak dapat menggunakan variabel CMake CMAKE_BUILD_TYPE untuk konfigurasi karena telah diselesaikan pada waktu pembuatan proyek VS dan akan selalu menjadi apa pun defaultnya.
sumber
$<CONFIGURATION>
Anda juga dapat menggunakan perintah find_library:
Dengan EXECUTABLE_PATH yang ditentukan, misalnya:
Anda dapat memindahkan file .dll yang Anda butuhkan, dengan file
sumber
Ini berguna untuk salah satunya
sumber
Anda mungkin perlu menambahkan target khusus dan membuatnya bergantung pada salah satu target yang dapat dieksekusi.
Untuk menyalin file menggunakan fungsi di atas, gunakan:
sumber
Saya seorang pemula CMake, tetapi saya tetap ingin berbagi pengalaman saya. Dalam kasus saya, saya memerlukan salinan pasca-pemasangan agar semua biner saya masuk. Dalam kasus biner pihak ketiga yang dapat diimpor dalam CMake, berikut ini yang berfungsi untuk saya:
Jelas IMPORTED_LOCATION_RELEASE dapat memiliki varian tergantung pada bagaimana perpustakaan bersama dibuat / dipasang. Bisa jadi IMPORTED_LOCATION_DEBUG.
Mungkin ada cara yang lebih baik untuk mendapatkan nama properti itu, saya tidak tahu.
sumber
Memindahkan file selama build menggunakan
install
Saya mengalami masalah ini saat mencoba mengikuti tutorial resmi CMake pada Langkah 9 . Ini adalah lokasi file yang ingin saya pindahkan:
Ini adalah lokasi yang saya inginkan untuk file tersebut:
Karena DLL ini dibuat sebagai pustaka bersama, yang saya lakukan hanyalah memasukkan baris ini ke
CMakeLists.txt
dalam subdirektori yang berisi kode sumber untuk pustaka tersebut.src/Mathfunctions/CMakeLists.txt
Berkat jawaban Anda, saya bisa memikirkan yang satu ini. Hanya satu baris, jadi saya rasa tidak apa-apa. The
$<CONFIG>
dapat memiliki dua nilai Debug atau Rilis Tergantung pada bagaimana proyek dibangun, sebagai pertanyaan awal yang diperlukan.sumber