Menggunakan CMake untuk menghasilkan file proyek Visual Studio C ++

93

Saya sedang mengerjakan proyek C ++ open source, untuk kode yang dikompilasi di Linux dan Windows. Saya menggunakan CMake untuk membuat kode di Linux. Untuk kemudahan pengaturan pengembangan dan alasan politik, saya harus tetap menggunakan file / editor proyek Visual Studio di Windows (saya tidak dapat beralih ke Code :: Blocks , misalnya). Saya melihat instruksi untuk menghasilkan file Visual Studio menggunakan CMake, seperti di sini .

Pernahkah Anda menggunakan CMake untuk menghasilkan file Visual Studio sebelumnya? Bagaimana pengalaman Anda? Misalkan saya ingin menambahkan file baru ke proyek saya. Apa alur kerja untuk ini?

amit
sumber
1
Bagi mereka yang menggunakan GNU + Linux mencoba membuat file proyek untuk Visual Studio, yang khusus untuk Windows, ingatlah jawaban ini . TL; DR: Generator adalah platform khusus dan Anda harus menggunakan Windows untuk melakukannya.
code_dredd

Jawaban:

57

CMake sebenarnya cukup bagus untuk ini. Bagian kuncinya adalah setiap orang di sisi Windows harus ingat untuk menjalankan CMake sebelum memuat solusi, dan semua orang di sisi Mac kami harus ingat untuk menjalankannya sebelum membuatnya.

Bagian tersulit adalah sebagai pengembang Windows memastikan perubahan struktural Anda ada di file cmakelist.txt dan bukan dalam solusi atau file proyek karena perubahan itu mungkin akan hilang dan bahkan jika tidak hilang tidak akan ditransfer ke sisi Mac yang juga membutuhkannya, dan orang-orang Mac harus ingat untuk tidak mengubah file make karena alasan yang sama.

Ini hanya membutuhkan sedikit pemikiran dan kesabaran, tetapi akan ada kesalahan pada awalnya. Tetapi jika Anda menggunakan integrasi berkelanjutan di kedua sisi maka ini akan terguncang lebih awal, dan orang-orang pada akhirnya akan terbiasa.

Alex
sumber
11
Jika ini benar sekali, itu tidak lagi. Setiap perubahan pada CMakeLists.txt akan menyebabkan regenerasi sistem build (file proyek untuk visual studio, makefiles, dll). Alur kerja dalam Visual Studio agak menjengkelkan karena Visual Studio tidak meregenerasi file proyek ketika mendeteksi bahwa hal-hal telah berubah tetapi malah menunggu Anda melakukan build yang menyebabkan dialog muncul karena build perlu dibatalkan untuk kembali -muat file proyek.
Vitali
1
Peringatan untuk ini adalah Anda tidak harus menjalankan kompiler Visual Studio melalui IDE. Anda dapat menjalankannya di baris perintah:C:\...> MSBuild ALL_BUILD.vcxproj
PfunnyGuy
2
@PfunnyGuy Lihat juga cmake --build ..
detly
@detly Terima kasih! Saya benar-benar menemukan itu, dan menggunakan cmake --build . --config Debug -- /nologo /verbosity:minimal /m. Saya akan memasukkan after . target run_testsuntuk menjalankan pengujian unit googletest saya, dan "Debug" dapat diganti dengan "Rilis". (Menambahkan opsi konfigurasi untuk Debug adalah opsional, karena ini adalah default, tetapi saya menyertakannya untuk menunjukkan bagaimana itu dapat ditukar dengan "Rilis")
PfunnyGuy
48

Tidak yakin apakah itu terkait langsung dengan pertanyaan, tetapi saya sedang mencari jawaban untuk cara menghasilkan * .sln dari proyek cmake. Saya telah menemukan bahwa seseorang dapat menggunakan sesuatu seperti ini:

cmake -G "Visual Studio 10"

Contoh ini menghasilkan file VS 2010 yang diperlukan dari file CMakeLists.txt input

Ghita
sumber
1
Di stackoverflow.com/questions/11269833/… @Ivan menunjukkan bahwa ini dapat dimasukkan ke dalam file PreLoad.cmake di folder yang sama dengan CMakeLists.txt tingkat atas Anda dan kemudian Anda dapat melakukannya cmake.
PfunnyGuy
25

Kami memindahkan rantai build departemen kami ke CMake, dan kami memiliki beberapa roadbump internal sejak departemen lain menggunakan file proyek kami dan biasanya hanya mengimpornya ke dalam solusi mereka. Kami juga memiliki beberapa keluhan tentang CMake yang tidak sepenuhnya terintegrasi ke dalam proyek Visual Studio / manajer solusi, sehingga file harus ditambahkan secara manual ke CMakeLists.txt; ini adalah jeda besar dalam alur kerja yang biasa dilakukan orang.

Tetapi secara umum, ini adalah transisi yang cukup mulus. Kami sangat senang karena kami tidak perlu lagi berurusan dengan file proyek.

Alur kerja konkret untuk menambahkan file baru ke sebuah proyek sangat sederhana:

  1. Buat file, pastikan file tersebut berada di tempat yang benar.
  2. Tambahkan file ke CMakeLists.txt.
  3. Membangun.

CMake 2.6 secara otomatis menjalankan ulang sendiri jika file CMakeLists.txt telah berubah (dan (semi-) secara otomatis memuat ulang solusi / proyek).

Ingat bahwa jika Anda melakukan build di luar sumber, Anda harus berhati-hati agar tidak membuat file sumber di direktori build (karena Visual Studio hanya mengetahui tentang direktori build).

JesperE
sumber
9

Seperti yang dikatakan Alex, ini bekerja dengan sangat baik. Satu-satunya bagian yang sulit adalah mengingat untuk membuat perubahan apa pun di file cmake, bukan dari dalam Visual Studio. Jadi di semua platform, alur kerjanya mirip dengan jika Anda menggunakan makefile biasa.

Tapi itu cukup mudah untuk dikerjakan, dan saya tidak punya masalah dengan cmake membuat file yang tidak valid atau semacamnya, jadi saya tidak akan terlalu khawatir.

jalf
sumber
9

CMake menghasilkan Proyek dan Solusi Visual Studio dengan mulus. Anda bahkan dapat membuat proyek / solusi untuk berbagai versi Visual Studio tanpa membuat perubahan apa pun pada berkas CMake.

Menambah dan menghapus file sumber hanyalah masalah memodifikasi CMakeLists.txtyang memiliki daftar file sumber dan membuat ulang proyek / solusi. Bahkan ada fungsi globbing untuk menemukan semua sumber dalam direktori (meskipun harus digunakan dengan hati-hati).

Tautan berikut menjelaskan perilaku khusus CMake dan Visual Studio dengan sangat baik.

CMake dan Visual Studio

ap-osd
sumber
Tautan itu dan proyek sampelnya sangat, sangat berguna, terima kasih untuk itu! Saya akan merekomendasikan untuk memasukkan beberapa kode sumber dari repo github ke dalam jawaban Anda, misalnya menyebutkan bahwa proyek CMake setara dengan solusi, dan sesuatu seperti add_executable digunakan untuk menambahkan ekuivalen proyek studio visual.
jrh
5

CMake dapat menghasilkan Visual Studio .projs/ yang sangat bagus .slns, tetapi selalu ada masalah dengan kebutuhan untuk memodifikasi .cmakefile daripada .proj/ .sln. Seperti sekarang, kita menghadapinya sebagai berikut:

  1. Semua file sumber masuk /srcdan file yang terlihat di Visual Studio hanyalah "tautan" ke mereka yang ditentukan di .filter.
  2. Programmer menambah / menghapus file mengingat untuk bekerja pada /srcdirektori yang ditentukan , bukan yang proyek default.
  3. Setelah selesai, dia menjalankan skrip yang "menyegarkan" .cmakefile masing-masing .
  4. Dia memeriksa apakah kode dapat dibangun di lingkungan yang dibuat ulang.
  5. Dia melakukan kodenya.

Pada awalnya kami sedikit takut bagaimana hasilnya, tetapi alur kerja bekerja dengan sangat baik dan dengan perbedaan yang bagus terlihat sebelum setiap komit, setiap orang dapat dengan mudah melihat apakah perubahannya dipetakan dengan benar dalam .cmakefile.

Satu hal penting yang perlu diketahui adalah kurangnya dukungan ( afaik ) untuk "Konfigurasi Solusi" di CMake. Seperti berdiri, Anda harus menghasilkan dua direktori dengan proyek / solusi - satu untuk setiap jenis build (debug, rilis, dll.). Tidak ada dukungan langsung untuk fitur yang lebih canggih - dengan kata lain: beralih antar konfigurasi tidak akan memberikan apa yang Anda harapkan.

XIII merah
sumber
4
Mulai CMake 2.8.10, solusi yang dihasilkan memiliki 4 konfigurasi build standar, dan ada dukungan untuk menentukan konfigurasi kustom tambahan.
Yohanes
0

Saya telah memulai proyek saya sendiri, yang disebut syncProj. Dokumentasi / tautan unduhan dari sini:

https://docs.google.com/document/d/1C1YrbFUVpTBXajbtrC62aXru2om6dy5rClyknBj5zHU/edit# https://sourceforge.net/projects/syncproj/

Jika Anda berencana menggunakan Visual studio untuk pengembangan, dan saat ini hanya C ++ yang didukung.

Keuntungan utama dibandingkan dengan sistem make lain adalah Anda benar-benar dapat men-debug skrip Anda, karena itu berbasis C #.

Jika Anda tidak terbiasa dengan syncProj, Anda cukup mengonversi solusi / proyek Anda ke skrip .cs, dan melanjutkan pengembangan lebih lanjut sejak saat itu.

Dalam cmake Anda perlu menulis semuanya dari awal.

TarmoPikaro
sumber