Setel opsi CFLAGS dan CXXFLAGS menggunakan CMake

90

Saya hanya ingin men-debug beberapa kode yang berjalan di Linux dan saya memerlukan debug build ( -O0 -ggdb). Jadi saya menambahkan hal-hal ini ke saya CMakeLists.txt:

set(CMAKE_BUILD_TYPE DEBUG)
set(CMAKE_C_FLAGS "-O0 -ggdb")
set(CMAKE_C_FLAGS_DEBUG "-O0 -ggdb")
set(CMAKE_C_FLAGS_RELEASE "-O0 -ggdb")
set(CMAKE_CXX_FLAGS "-O0 -ggdb")
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "-O0 -ggdb")

Ketika saya mencoba untuk mengkompilasi saya beralih ke verbose menggunakan make VERBOSE=1 Dan saya mengamati hasilnya, seperti ini

... /usr/bin/c++ -D_BSD_SOURCE **-O0 -ggdb** -Wnon-virtual-dtor 
-Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -Wall -W 
-Wpointer-arith -Wformat-security -fno-exceptions -DQT_NO_EXCEPTIONS 
-fno-check-new -fno-common -Woverloaded-virtual -fno-threadsafe-statics 
-fvisibility=hidden -fvisibility-inlines-hidden **-g -O2** 
-fno-reorder-blocks -fno-schedule-insns -fno-inline ...

Rupanya kode tersebut dikompilasi "-g -O2"dan ini bukan yang saya inginkan. Bagaimana saya bisa memaksanya untuk digunakan "-O0 -ggdb"saja?

majie
sumber
1
Jika Anda menginginkan build yang dapat di-debug, cukup lakukan konfigurasi debug pada baris perintah. "cmake -DCMAKE_BUILD_TYPE = Debug". Build yang dihasilkan akan memiliki flag debug untuk sistem build yang diberikan. Tidak ada alasan untuk mengubah file cmake itu sendiri. Anda juga dapat mengirimkan nilai CMAKE_C_FLAGS dengan argumen -D lainnya.
Atifm

Jawaban:

84

Anda perlu mengatur bendera setelah itu projectperintah dalam CMakeLists.txt Anda.

Juga, jika Anda menelepon include(${QT_USE_FILE})atau add_definitions(${QT_DEFINITIONS}), Anda harus menyertakan setperintah ini setelah yang Qt karena ini akan menambahkan flag lebih lanjut. Jika itu adalah kasus, Anda mungkin hanya ingin menambahkan bendera Anda dengan yang Qt, sehingga perubahan misalnya

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -ggdb")
Fraser
sumber
Saya menempatkan bendera itu setelah perintah proyek. Tapi hasilnya sama.
majie
Saya baru saja memperhatikan QT_NO_EXCEPTIONSdi benderamu, jadi saya telah memperpanjang jawaban saya sedikit. Saya menduga itu ${QT_DEFINITIONS}menambahkan -g -O2.
Fraser
1
Ya, ini dia. Menempatkan setperintah - perintah itu setelah yang Qt memecahkan masalah. Terima kasih banyak.
majie
17

Solusi termudah yang berfungsi dengan baik bagi saya adalah ini:

export CFLAGS=-ggdb
export CXXFLAGS=-ggdb

CMake akan menambahkannya ke semua flag konfigurasi. Pastikan untuk menghapus cache CMake.

Virus_7
sumber
3
Menyetel flag di lingkungan seperti ini adalah satu-satunya cara untuk melakukannya tanpa memodifikasi CMakeLists.txt Anda. Perhatikan bahwa nilai lingkungan hanya dibaca pada konfigurasi pertama dan kemudian dimasukkan ke dalam cache, jadi jika Anda ingin mengubahnya, Anda perlu menghapus cache CMake dan menjalankan kembali langkah konfigurasi dengan nilai baru di env. Docs: cmake.org/cmake/help/latest/envvar/CFLAGS.html cmake.org/cmake/help/latest/envvar/CXXFLAGS.html
bleater
3
Itu bukan "termudah", itulah satu-satunya cara yang benar untuk melakukannya.
Slava
Tangkapan kecil, jika generator mengonfigurasi flag spesifik untuk tipe build tertentu (misalnya, di CMAKE_CXX_FLAGS_DEBUG dll.), Maka memasukkannya ke dalam CXXFLAGS(dan dengan demikian memasukkannya ke dalam CMAKE_CXX_FLAGS) sebenarnya tidak cukup untuk meneruskan opsi ke kompilator. Konfigurasi per jenis build lebih diutamakan daripada input pengguna.
Ext3h
16

Anda harus mengubah BENDERA default cmake C / CXX.

Menurut CMAKE_BUILD_TYPE={DEBUG/MINSIZEREL/RELWITHDEBINFO/RELEASE} put in the mainCMakeLists.txt salah satu dari:

Untuk C

set(CMAKE_C_FLAGS_DEBUG "put your flags")
set(CMAKE_C_FLAGS_MINSIZEREL "put your flags")
set(CMAKE_C_FLAGS_RELWITHDEBINFO "put your flags")
set(CMAKE_C_FLAGS_RELEASE "put your flags")

Untuk C ++

set(CMAKE_CXX_FLAGS_DEBUG "put your flags")
set(CMAKE_CXX_FLAGS_MINSIZEREL "put your flags")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "put your flags")
set(CMAKE_CXX_FLAGS_RELEASE "put your flags")

Ini akan mengganti nilai yang ditentukan dalam CMakeCache.txt

carl-erwin
sumber
yang mengesampingkan bendera cmake Anda yang saat ini. jadi itu merusak debugging kecuali Anda menambahkan -g flag sendiri (gcc)
activedecay
Apakah ada pemikiran yang sama menggunakan sintaks "Modern Cmake"?
Sandburg
6

Pada sistem Unix, untuk beberapa proyek, saya menambahkan baris-baris ini ke dalam CMakeLists.txt dan berhasil dikompilasi karena base ( / usr / include ) dan lokal termasuk ( / usr / local / include ) masuk ke direktori terpisah:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I/usr/local/include -L/usr/local/lib")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I/usr/local/include")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/local/lib")

Ini menambahkan direktori yang benar, termasuk jalur untuk tanda compiler C dan C ++ dan jalur direktori yang benar untuk tanda linker.

Catatan: Compiler C ++ (c ++) tidak mendukung -L, jadi kita harus menggunakan CMAKE_EXE_LINKER_FLAGS

sbz
sumber
3
Bukankah lebih baik menggunakan include_directoriesdaripada -Ibendera?
Tejas Kale
Terima kasih banyak. Saya memasang flag linker saya CMAKE_CXX_FLAGS, yang menyebabkannya diabaikan. Sekarang saya menempatkannya CMAKE_EXE_LINKER_FLAGSberdasarkan jawaban Anda, mereka berfungsi dengan baik.
Nahiyan