CMake kullanarak CFLAGS ve CXXFLAGS seçeneklerini ayarlayın


90

Sadece Linux üzerinde çalışan bazı kodlarda hata ayıklamak istiyorum ve bir hata ayıklama yapısına ihtiyacım var ( -O0 -ggdb). Ben de şunları ekledim 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")

Derlemeyi denediğimde, kullanmaya make VERBOSE=1 başladım ve çıktıyı şöyle gözlemledim.

... /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 ...

Görünüşe göre kod derlenmiş "-g -O2"ve istediğim bu değil. "-O0 -ggdb"Yalnızca kullanmaya nasıl zorlayabilirim ?


1
Hata ayıklanabilir bir yapı istiyorsanız, komut satırında bir hata ayıklama yapılandırması yapın. "cmake -DCMAKE_BUILD_TYPE = Hata Ayıkla". Elde edilen derleme, verilen yapı sistemi için hata ayıklama bayraklarına sahip olacaktır. Cmake dosyasının kendisini değiştirmeye gerek yok. CMAKE_C_FLAGS değerini başka bir -D bağımsız değişkeniyle de gönderebilirsiniz.
Atifm

Yanıtlar:


84

Sen bayrakları ayarlamak gerekir sonraproject senin CMakeLists.txt komutunu.

Ayrıca, include(${QT_USE_FILE})veya add_definitions(${QT_DEFINITIONS})arıyorsanız, bu setkomutları Qt komutlarından sonra eklemelisiniz, çünkü bunlar daha fazla bayrak ekleyecektir. Bu takdirde ise durum, belki sadece Qt olanlara Bayraklarınızı eklemek istiyorsunuz mesela değişikliğin böylece

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -ggdb")

Bu bayrakları proje komutundan sonra koydum. Ancak çıktı aynı.
majie

Sadece QT_NO_EXCEPTIONSbayraklarınızda olduğunu fark ettim , bu yüzden cevabımı biraz uzattım. Sanırım ${QT_DEFINITIONS}bunun eki -g -O2.
Fraser

1
Evet, işte bu. Bu setkomutları Qt komutlarından sonra koymak sorunu çözer. Çok teşekkür ederim.
majie

17

Benim için iyi çalışan en kolay çözüm şudur:

export CFLAGS=-ggdb
export CXXFLAGS=-ggdb

CMake bunları tüm konfigürasyonların bayraklarına ekleyecektir. CMake önbelleğini temizlediğinizden emin olun.


3
Ortamdaki bayrakları bu şekilde ayarlamak, CMakeLists.txt dosyanızı değiştirmeden yapmanın tek yoludur. Ortam değerinin yalnızca ilk yapılandırmada okunduğunu ve ardından önbelleğe alındığını unutmayın; bu nedenle, bunu değiştirmek isterseniz CMake önbelleğini temizlemeniz ve yapılandırma adımını env içindeki yeni değerlerle yeniden çalıştırmanız gerekir. Dokümanlar: cmake.org/cmake/help/latest/envvar/CFLAGS.html cmake.org/cmake/help/latest/envvar/CXXFLAGS.html
Bleater

3
Bu "en kolay" değil, bunu yapmanın tek doğru yolu bu.
Slava

Küçük yakalama, eğer üretici belirli bir yapı türü için (örneğin, CMAKE_CXX_FLAGS_DEBUG vb.) Belirli bir bayrak yapılandırıyorsa , o zaman bunu dahil etmek CXXFLAGS(ve böylece içine enjekte etmek CMAKE_CXX_FLAGS) seçeneği derleyiciye geçirmek için yeterli değildir. Derleme türü başına yapılandırma, kullanıcı girdisine göre önceliklidir.
Ext3h

16

Cmake C / CXX varsayılan BAYRAKLARINI değiştirmelisiniz.

Göre CMAKE_BUILD_TYPE={DEBUG/MINSIZEREL/RELWITHDEBINFO/RELEASE} ana koymak CMakeLists.txtbiri:

C için

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")

C ++ için

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")

Bu, CMakeCache.txt'de tanımlanan değerleri geçersiz kılar


bu geçerli olan cmake bayraklarınızı geçersiz kılar. bu yüzden -g işaretini kendiniz eklemediğiniz sürece hata ayıklamayı keser (gcc)
aktive

"Modern Cmake" sözdizimini kullanan aynı düşünce var mı?
Sandburg

6

Unix sistemlerinde, birkaç proje için bu satırları CMakeLists.txt dosyasına ekledim ve başarılı bir şekilde derleniyordu çünkü base ( / usr / include ) ve local include ( / usr / local / include ) ayrı dizinlere giriyor:

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")

C ve C ++ derleyici bayraklarının yolları ve bağlayıcı bayrakları için doğru dizin yolu dahil olmak üzere doğru dizini ekler.

Not: C ++ derleyicisi (c ++) -L'yi desteklemez, bu nedenle CMAKE_EXE_LINKER_FLAGS kullanmalıyız


3
Bayrak include_directoriesyerine kullanmak daha iyi değil -Imi?
Tejas Kale

Çok teşekkür ederim. Bağlayıcı bayraklarımı yerleştiriyordum CMAKE_CXX_FLAGS, bu da onların göz ardı edilmesine neden oldu. Şimdi onları CMAKE_EXE_LINKER_FLAGScevabınıza göre yerleştirdiğime göre, gayet iyi çalışıyorlar.
Nahiyan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.