Debug vs Rilis di CMake


436

Dalam proyek yang disusun GCC,

  • Bagaimana cara menjalankan CMake untuk setiap jenis target (debug / rilis)?
  • Bagaimana cara menentukan debug dan melepaskan flag C / C ++ menggunakan CMake?
  • Bagaimana cara saya menyatakan bahwa executable utama akan dikompilasi dengan g++dan satu perpustakaan bersarang dengan gcc?

Jawaban:


659

Dengan CMake, umumnya disarankan untuk melakukan build "out of source" . Buat Anda CMakeLists.txtdi root proyek Anda. Kemudian dari akar proyek Anda:

mkdir Release
cd Release
cmake -DCMAKE_BUILD_TYPE=Release ..
make

Dan untuk Debug(lagi dari akar proyek Anda):

mkdir Debug
cd Debug
cmake -DCMAKE_BUILD_TYPE=Debug ..
make

ReleaseSaya Debugakan menambahkan flag yang sesuai untuk kompiler Anda. Ada juga RelWithDebInfodan MinSizeRelmembangun konfigurasi.


Anda dapat memodifikasi / menambahkan ke flag dengan menentukan file toolchain di mana Anda dapat menambahkan CMAKE_C_FLAGS_DEBUGdan CMAKE_C_FLAGS_RELEASEvariabel, misalnya:

set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall")

Lihat CMAKE_BUILD_TYPE untuk detail lebih lanjut.


Adapun pertanyaan ketiga Anda, saya tidak yakin persis apa yang Anda tanyakan. CMake akan secara otomatis mendeteksi dan menggunakan kompiler yang sesuai untuk file sumber Anda yang berbeda.


3
Anda juga dapat melakukan cmake -i ..sebaliknya, jadi cmake akan berjalan secara interaktif, menanyakan jenis bangunan yang Anda inginkan (Tidak Ada, Rilis, Debug, MinSizeRel, RelWithDebInfo).
thiagowfx

5
@thiagowfx -ihasil pilihan dalam pesan kesalahan ini: The "cmake -i" wizard mode is no longer supported.. Saya menggunakan cmake 3.7.1
Philipp Claßen

3
Pengamatan yang bagus. Tampaknya sudah usang sejak versi 3.0.0. Referensi .
thiagowfx

7
Ini BUKAN dari membangun sumber jika Anda membuat sub-direktori! Disarankan untuk membuat direktori build di luar / di atas direktori sumber.
Victor Lamoine

Perhatikan bahwa jika CMAKE_BUILD_TYPEtidak disetel, cmake tidak akan memilih tipe build default, maka baris perintah kompiler yang dihasilkan tidak akan cocok dengan konfigurasi build apa pun.
david

23

Untuk debug / lepaskan flag, lihat CMAKE_BUILD_TYPEvariabelnya (Anda anggap sebagai cmake -DCMAKE_BUILD_TYPE=value). Dibutuhkan nilai-nilai seperti Release,Debug , dll

https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/Useful-Variables#compilers-and-tools

cmake menggunakan ekstensi untuk memilih kompiler, jadi cukup beri nama file Anda .c.

Anda dapat menimpanya dengan berbagai pengaturan:

Sebagai contoh:

set_source_files_properties(yourfile.c LANGUAGE CXX) 

Akan mengkompilasi file .c dengan g ++. Tautan di atas juga menunjukkan cara memilih kompiler spesifik untuk C / C ++.


16

Alih-alih memanipulasi CMAKE_CXX_FLAGSstring secara langsung (yang bisa dilakukan dengan lebih baik menggunakan string(APPEND CMAKE_CXX_FLAGS_DEBUG " -g3")btw), Anda dapat menggunakan add_compiler_options:

add_compile_options(
  "-Wall" "-Wpedantic" "-Wextra" "-fexceptions"
  "$<$<CONFIG:DEBUG>:-O0;-g3;-ggdb>"
)

Ini akan menambahkan peringatan yang ditentukan untuk semua tipe build, tetapi hanya flag debugging yang diberikan untuk DEBUGbuild. Perhatikan bahwa opsi kompilasi disimpan sebagai daftar CMake, yang hanya berupa string yang memisahkan elemen-elemennya dengan titik koma ;.


2
Tidak akan list(APPEND CMAKE_CXX_FLAGS_DEBUG "-g3")menambahkan titik koma sebelum -g3 menghentikan perintah dan memulai perintah baru -g3 yang pasti akan gagal?
cburn11

Kau benar CMAKE_CXX_FLAGSadalah tidak daftar cmake tapi string bendera baris perintah yang dipisahkan oleh spasi. Saya menemukan bahwa perilaku tidak konsisten ...
sebastian

add_compile_options () rapi. Itu dilengkapi dengan add_link_options () untuk saat Anda perlu menambahkan opsi ke penghubung juga seperti -fsanitize = alamat.
Bowie Owens

1
Apakah ini masih cara yang tepat di tahun 2020 / cmake 3.17? Baris terakhir itu terlihat tidak menyenangkan
Jay


5

// CMakeLists.txt: rilis

set(CMAKE_CONFIGURATION_TYPES "Release" CACHE STRING "" FORCE)

// CMakeLists.txt: debug

set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE)

10
saya tidak mengerti mengapa ini turun sebagai pilihan, itu adalah kode nyata yang digunakan dalam produksi, tetapi saya tidak peduli.
sailfish009

5
Mungkin karena menurut dokumen CMake CMAKE_CONFIGURATION_TYPESberisi nilai yang mungkin untuk CMAKE_BUILD_TYPE. Jadi, Anda harus mengatur yang terakhir sebagai jawaban lain yang disarankan. Mungkin solusi Anda berhasil karena membatasi pilihan yang mungkin ada pada yang ingin Anda miliki.
bjhend

2
Suara positif karena ini akan berhasil. Saya suka saya beberapa CMake tetapi ada kebiasaan dan kadang-kadang Anda perlu menggunakan palu besar untuk membuat hal-hal bekerja. Saya punya beberapa proyek yang karena satu dan lain alasan akan menolak bendera baris perintah.
cory.todd

Berikut ini beberapa informasi tambahan tentang mengapa pengaturan ini tidak berfungsi: stackoverflow.com/a/24470998/3196753
tresf
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.