Hata ayıklama ve CMake'te yayınlama


436

GCC tarafından derlenen bir projede,

  • Her hedef türü (hata ayıklama / bırakma) için CMake'i nasıl çalıştırırım?
  • CMake kullanarak hata ayıklama ve C / C ++ bayraklarını nasıl serbest bırakırım?
  • Ana yürütülebilir dosyanın derleneceğini g++ve bir iç içe kitaplığın derleneceğini nasıl ifade edebilirim gcc?

Yanıtlar:


659

CMake ile genellikle "kaynak dışı" bir yapı yapılması önerilir . CREATE CMakeLists.txtProjenizin kök. Sonra projenizin kökünden:

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

Ve Debug(yine projenizin kökünden):

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

Release/ Debugderleyicinize uygun bayrakları ekleyecektir. De vardır RelWithDebInfove MinSizeRelyapı konfigürasyonları.


Ekleyebileceğiniz bir araç zinciri dosyasıCMAKE_C_FLAGS_DEBUG ve CMAKE_C_FLAGS_RELEASEdeğişkenler belirterek bayrakları değiştirebilir / bunlara ekleyebilirsiniz , örneğin:

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

Daha fazla bilgi için CMAKE_BUILD_TYPE sayfasına bakın.


Üçüncü sorunuza gelince, tam olarak ne sorduğunuzdan emin değilim. CMake, farklı kaynak dosyalarınıza uygun derleyiciyi otomatik olarak algılamalı ve kullanmalıdır.


3
Bunun cmake -i ..yerine bir de yapabilirsiniz , böylece cmake etkileşimli olarak çalışarak istediğiniz yapı türünü sorar (None, Release, Debug, MinSizeRel, RelWithDebInfo).
thiagowfx

5
@thiagowfx -iBu hata iletisinde opsiyon sonuçları: The "cmake -i" wizard mode is no longer supported.. Cmake 3.7.1 kullanıyorum
Philipp Claßen

3
Güzel gözlem. Sürümden bu yana kullanımdan kaldırılmış gibi görünüyor 3.0.0. Referans .
thiagowfx

7
Bir alt dizin oluşturuyorsanız bu kaynak dışı bir yapı DEĞİLDİR! Derleme dizinini kaynak dizinin dışında / üstünde oluşturmanız önerilir.
Victor Lamoine

Eğer Not CMAKE_BUILD_TYPEayarlanmamış, cmake dolayısıyla oluşturulan derleyici komut satırı herhangi yapı yapılandırma eşleşen olmayacak, herhangi bir varsayılan inşa türünü seçmek olmaz.
david

23

Hata ayıklama / bırakma bayrakları için, CMAKE_BUILD_TYPEdeğişkene bakın (olarak iletirsiniz cmake -DCMAKE_BUILD_TYPE=value). Sanki değerlerini alır Release, Debugvb

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

cmake, derleyiciyi seçmek için uzantıyı kullanır, bu nedenle dosyalarınızı .c olarak adlandırın.

Bunu çeşitli ayarlarla geçersiz kılabilirsiniz:

Örneğin:

set_source_files_properties(yourfile.c LANGUAGE CXX) 

.C dosyalarını g ++ ile derler. Yukarıdaki bağlantı ayrıca C / C ++ için belirli bir derleyicinin nasıl seçileceğini gösterir.


16

CMAKE_CXX_FLAGSDizeleri doğrudan değiştirmek yerine ( string(APPEND CMAKE_CXX_FLAGS_DEBUG " -g3")btw kullanılarak daha güzel yapılabilir ) şunları kullanabilirsiniz add_compiler_options:

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

Bu, tüm uyarı türlerine belirtilen uyarıları ekler, ancak yapıya yalnızca belirtilen hata ayıklama bayraklarını ekler DEBUG. Derleme seçeneklerinin, öğelerini noktalı virgülle ayıran bir dize olan bir CMake listesi olarak saklandığını unutmayın ;.


2
Olmaz list(APPEND CMAKE_CXX_FLAGS_DEBUG "-g3")-g3 komuta ve mutlaka başarısız olur yeni bir komut -g3 başlamadan sonlandırıldı önce noktalı virgül eklemek?
cburn11

Haklısın CMAKE_CXX_FLAGSolduğunu değil bir cmake liste ama boşlukla ayrılmış komut satırı bayrakları bir dize. Bu davranışı tutarsız buluyorum ...
sebastian

add_compile_options () düzgün. Bağlayıcıya -fsanitize = adres gibi seçenekler eklemeniz gerektiğinde add_link_options () ile tamamlanır.
Bowie Owens

1
2020 / cmake 3.17'de hala uygun olan bu mu? Bu son satır kötü görünüyor
Jay


5

// CMakeLists.txt: yayın

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

// CMakeLists.txt: hata ayıklama

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

10
neden bu almak aşağı oy anlamıyorum, üretimde kullanılan gerçek kod, btw umurumda değil.
sailfish009

5
Belki CMake belgelerine göre CMAKE_CONFIGURATION_TYPESolası değerleri içerir çünkü CMAKE_BUILD_TYPE. Bu yüzden ikincisini diğer cevapların önerdiği gibi ayarlamalısınız. Belki çözümünüz işe yarayabilir, çünkü olası seçimleri sahip olmak istediğinizle sınırlar.
bjhend

2
Olumlu oy çünkü bu işe yarayacak. Bana biraz CMake'i seviyorum ama tuhaflıklar var ve bazen işleri çalıştırmak için büyük çekiç kullanmanız gerekiyor. Bir sebepten ötürü komut satırı bayrağını reddedecek bazı projelerim var.
cory.todd

Ayarın neden işe yaramayabileceğine dair bazı ek bilgiler: stackoverflow.com/a/24470998/3196753
tresf
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.