Debug vs Release ใน CMake


436

ในโครงการที่รวบรวม GCC

  • ฉันจะเรียกใช้ CMake สำหรับแต่ละประเภทเป้าหมาย (debug / release) ได้อย่างไร
  • ฉันจะระบุการดีบักและปล่อยแฟล็ก C / C ++ โดยใช้ CMake ได้อย่างไร
  • ฉันจะแสดงให้เห็นได้อย่างไรว่าไฟล์ประมวลผลหลักจะถูกคอมไพล์ด้วยg++และหนึ่งไลบรารีซ้อนกันด้วยgcc?

คำตอบ:


659

ด้วย CMake ก็ขอแนะนำโดยทั่วไปจะทำ"ออกจากแหล่งที่มา" สร้าง สร้างของคุณCMakeLists.txtในรากของโครงการของคุณ จากรากของโครงการของคุณ:

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

และสำหรับDebug(อีกครั้งจากรากของโครงการของคุณ):

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

Release/ Debugจะเพิ่มค่าสถานะที่เหมาะสมสำหรับคอมไพเลอร์ของคุณ นอกจากนี้ยังมีRelWithDebInfoและMinSizeRelสร้างการกำหนดค่า


คุณสามารถแก้ไข / เพิ่มการตั้งค่าสถานะโดยการระบุไฟล์ toolchainที่คุณสามารถเพิ่มCMAKE_C_FLAGS_DEBUGและCMAKE_C_FLAGS_RELEASEตัวแปรเช่น:

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

ดูCMAKE_BUILD_TYPEสำหรับรายละเอียดเพิ่มเติม


สำหรับคำถามที่สามของคุณฉันไม่แน่ใจว่าคุณถามอะไร CMake ควรตรวจจับและใช้คอมไพเลอร์ที่เหมาะสมกับไฟล์ต้นฉบับของคุณโดยอัตโนมัติ


3
นอกจากนี้คุณยังสามารถทำcmake -i ..แทนได้ดังนั้น cmake จะทำงานแบบโต้ตอบโดยถามว่าคุณต้องการสร้างบิลด์ประเภทใด (None, Release, Debug, MinSizeRel, RelWithDebInfo)
thiagowfx

5
@thiagowfx ผลการเลือกในข้อผิดพลาดนี้:-i The "cmake -i" wizard mode is no longer supported.ฉันใช้ cmake 3.7.1
Philipp Claßen

3
การสังเกตที่ดี 3.0.0ดูเหมือนว่ามันจะถูกเลิกใช้ตั้งแต่รุ่น การอ้างอิง
thiagowfx

7
นี่ไม่ใช่การสร้างซอร์สหากคุณกำลังสร้างไดเร็กทอรีย่อย! ขอแนะนำให้สร้างไดเรกทอรีสร้างนอก / เหนือไดเรกทอรีต้นทาง
Victor Lamoine

โปรดทราบว่าถ้าCMAKE_BUILD_TYPEไม่ได้ตั้งค่า cmake จะไม่เลือกประเภทบิลด์เริ่มต้นใด ๆ ดังนั้นบรรทัดคำสั่งคอมไพเลอร์ที่สร้างขึ้นจะไม่ตรงกับการกำหนดค่าบิลด์ใด ๆ
david

23

สำหรับการดีบัก / ปล่อยแฟล็กให้ดูCMAKE_BUILD_TYPEตัวแปร (คุณผ่านเป็นcmake -DCMAKE_BUILD_TYPE=value) มันต้องใช้ค่าเช่นRelease, Debugฯลฯ

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

cmake ใช้ส่วนขยายเพื่อเลือกคอมไพเลอร์ดังนั้นเพียงตั้งชื่อไฟล์ของคุณ

คุณสามารถแทนที่สิ่งนี้ได้ด้วยการตั้งค่าต่าง ๆ :

ตัวอย่างเช่น:

set_source_files_properties(yourfile.c LANGUAGE CXX) 

จะรวบรวมไฟล์. c กับ g ++ ลิงค์ด้านบนยังแสดงวิธีการเลือกคอมไพเลอร์เฉพาะสำหรับ C / C ++


16

แทนที่จะจัดการกับCMAKE_CXX_FLAGSสตริงโดยตรง (ซึ่งสามารถทำได้ดีกว่าการใช้string(APPEND CMAKE_CXX_FLAGS_DEBUG " -g3")btw) คุณสามารถใช้add_compiler_options:

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

สิ่งนี้จะเพิ่มคำเตือนที่ระบุลงในบิลด์ทุกประเภท แต่จะมีเฉพาะการดีบักแฟล็กที่กำหนดให้กับDEBUGบิลด์ โปรดทราบว่าตัวเลือกการรวบรวมจะถูกเก็บไว้เป็นรายการ CMake ;ซึ่งเป็นเพียงสตริงแยกองค์ประกอบด้วยเครื่องหมายอัฒภาค


2
จะไม่list(APPEND CMAKE_CXX_FLAGS_DEBUG "-g3")เพิ่มเซมิโคลอนก่อน -g3 ยกเลิกคำสั่งและเริ่มต้นคำสั่งใหม่ -g3 ซึ่งจะล้มเหลวอย่างแน่นอน?
cburn11

คุณขวาCMAKE_CXX_FLAGSคือไม่ได้เป็นรายการที่ CMake แต่สตริงของธงบรรทัดคำสั่งพื้นที่แยก ฉันพบว่าพฤติกรรมนั้นไม่สอดคล้อง ...
เซบาสเตียน

add_compile_options () เรียบร้อย มันเสริมโดย add_link_options () สำหรับเมื่อคุณต้องการเพิ่มตัวเลือกไปยังลิงเกอร์เช่น -fsanitize = address
Bowie Owens

1
นี่เป็นวิธีที่เหมาะสมในปี 2020 / cmake 3.17 หรือไม่ บรรทัดสุดท้ายนั้นดูน่ารังเกียจ
Jay

8

หากคุณต้องการสร้างการกำหนดค่าที่แตกต่างกันโดยไม่ต้องสร้างใหม่หากใช้คุณยังสามารถเรียกใช้cmake --build {$PWD} --config <cfg>สำหรับเครื่องมือที่มีหลายการกำหนดค่าเลือก<cfg>ex Debug, Release, MinSizeRel, RelWithDebInfo

https://cmake.org/cmake/help/v2.8.11/cmake.html#opt%3a--builddir


ฉันพยายามเล่นด้วย--configตัวเลือกโดยไม่มีผลลัพธ์ใด ๆ มันไม่ได้ส่งผลกระทบต่อ$<CONFIG>ตัวแปร-DCMAKE_BUILD_TYPE=ไม่
loshad vtapkah

5

// CMakeLists.txt: release

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

// CMakeLists.txt: debug

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

10
ฉันไม่เข้าใจว่าทำไมสิ่งนี้ถึงลงคะแนนมันเป็นรหัสจริงที่ใช้ในการผลิต btw ฉันไม่สนใจ
sailfish009

5
อาจจะเป็นเพราะตามเอกสาร CMake มีค่าที่เป็นไปได้สำหรับCMAKE_CONFIGURATION_TYPES CMAKE_BUILD_TYPEดังนั้นคุณควรกำหนดอย่างหลังเป็นคำตอบอื่น ๆ ที่แนะนำ บางทีโซลูชันของคุณอาจใช้งานได้เพราะมัน จำกัด ตัวเลือกที่เป็นไปได้สำหรับสิ่งที่คุณต้องการ
bjhend

2
โหวตเพราะสิ่งนี้จะใช้ได้ ฉันรัก CMake ของฉัน แต่มีนิสัยใจคอและบางครั้งคุณต้องใช้ค้อนขนาดใหญ่เพื่อทำให้สิ่งต่าง ๆ ทำงานได้ ฉันมีโปรเจ็กต์บางอย่างที่มีเหตุผลอย่างใดอย่างหนึ่งจะปฏิเสธการตั้งค่าสถานะบรรทัดคำสั่ง
cory.todd

ต่อไปนี้เป็นข้อมูลเพิ่มเติมเกี่ยวกับสาเหตุที่การตั้งค่าไม่ทำงาน: stackoverflow.com/a/24470998/3196753
tresf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.