ตั้งค่าตัวเลือก CFLAGS และ CXXFLAGS โดยใช้ CMake


90

ฉันแค่ต้องการดีบักโค้ดบางตัวที่ทำงานบน Linux และฉันต้องการ debug build ( -O0 -ggdb) ดังนั้นฉันจึงเพิ่มสิ่งเหล่านี้ใน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")

เมื่อฉันพยายามรวบรวมฉันเปิดใช้ verbose make VERBOSE=1 และฉันสังเกตเห็นผลลัพธ์เช่นนี้

... /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 -O2"และนี่ไม่ใช่สิ่งที่ฉันต้องการ จะบังคับให้ใช้"-O0 -ggdb"อย่างเดียวได้อย่างไร?


1
หากคุณต้องการบิวด์ที่แก้จุดบกพร่องได้เพียงทำการดีบักกำหนดค่าที่บรรทัดคำสั่ง "cmake -DCMAKE_BUILD_TYPE = Debug" บิลด์ผลลัพธ์จะมีแฟล็กการดีบักสำหรับระบบบิลด์ที่กำหนด ไม่มีเหตุผลที่จะแก้ไขไฟล์ cmake เอง คุณยังสามารถส่งค่า CMAKE_C_FLAGS ด้วยอาร์กิวเมนต์ -D อื่น
Atifm

คำตอบ:


84

คุณจำเป็นต้องตั้งธงหลังจากprojectคำสั่งใน CMakeLists.txt ของคุณ

นอกจากนี้หากคุณกำลังโทรinclude(${QT_USE_FILE})หรือadd_definitions(${QT_DEFINITIONS})คุณควรรวมsetคำสั่งเหล่านี้ไว้หลังคำสั่ง Qt เนื่องจากสิ่งเหล่านี้จะต่อท้ายแฟล็กเพิ่มเติม หากเป็นเช่นนั้นคุณอาจแค่ต้องการต่อท้ายแฟล็กของคุณเข้ากับแฟล็ก Qt ดังนั้นให้เปลี่ยนเป็นเช่น

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

ฉันใส่แฟล็กเหล่านั้นไว้หลังคำสั่งโครงการ แต่ผลลัพธ์จะเหมือนกัน
majie

ฉันเพิ่งสังเกตเห็นQT_NO_EXCEPTIONSธงของคุณดังนั้นฉันจึงขยายคำตอบออกไปเล็กน้อย ฉันเดาว่า${QT_DEFINITIONS}กำลังต่อท้ายไฟล์-g -O2.
Fraser

1
ใช่นี่คือมัน การใส่setคำสั่งเหล่านั้นหลังจากคำสั่ง Qt ช่วยแก้ปัญหาได้ ขอบคุณมาก.
majie

17

วิธีแก้ปัญหาที่ง่ายที่สุดสำหรับฉันคือ:

export CFLAGS=-ggdb
export CXXFLAGS=-ggdb

CMake จะผนวกเข้ากับแฟล็กการกำหนดค่าทั้งหมด อย่าลืมล้างแคช CMake


3
การตั้งค่าแฟล็กในสภาพแวดล้อมเช่นนี้เป็นวิธีเดียวที่จะทำได้โดยไม่ต้องแก้ไข CMakeLists.txt ของคุณ โปรดทราบว่าค่าสภาพแวดล้อมจะอ่านได้ในการกำหนดค่าแรกเท่านั้นจากนั้นจะใส่ลงในแคชดังนั้นหากคุณต้องการเปลี่ยนแปลงสิ่งนี้คุณต้องล้างแคช CMake และเรียกใช้ขั้นตอนการกำหนดค่าใหม่อีกครั้งด้วยค่าใหม่ใน env เอกสาร: cmake.org/cmake/help/latest/envvar/CFLAGS.html cmake.org/cmake/help/latest/envvar/CXXFLAGS.html
bleater

3
นั่นไม่ใช่วิธีที่ "ง่ายที่สุด" แต่เป็นวิธีเดียวที่ถูกต้อง
Slava

Minor catch หากตัวสร้างกำหนดค่าแฟล็กเฉพาะสำหรับชนิดบิลด์ที่เฉพาะเจาะจง (เช่นในCMAKE_CXX_FLAGS_DEBUG ฯลฯ ) การรวมไว้ในCXXFLAGS(และด้วยการฉีดเข้าไปในนั้นCMAKE_CXX_FLAGS) ไม่เพียงพอสำหรับการส่งผ่านตัวเลือกไปยังคอมไพเลอร์ คอนฟิกูเรชันต่อประเภทบิลด์มีความสำคัญเหนืออินพุตของผู้ใช้
3

16

คุณต้องเปลี่ยนค่าเริ่มต้นของ cmake C / CXX FLAGS

ตามที่ระบุCMAKE_BUILD_TYPE={DEBUG/MINSIZEREL/RELWITHDEBINFO/RELEASE} ไว้ในรายการหลักCMakeLists.txtของ:

สำหรับ 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")

สำหรับ 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")

สิ่งนี้จะแทนที่ค่าที่กำหนดใน CMakeCache.txt


ที่แทนที่แฟล็ก cmake ของคุณที่เป็นปัจจุบัน ดังนั้นจึงหยุดการดีบักเว้นแต่คุณจะเพิ่มแฟ
ล็ก

มีความคิดเดียวกันกับการใช้ไวยากรณ์ "Modern Cmake" หรือไม่?
Sandburg

6

ในระบบ Unix สำหรับหลายโปรเจ็กต์ฉันได้เพิ่มบรรทัดเหล่านี้ลงใน CMakeLists.txt และคอมไพล์สำเร็จเนื่องจากbase ( / usr / include ) และlocalรวม ( / usr / local / include ) เข้าไปในไดเร็กทอรีที่แยกจากกัน:

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 และ C ++ และพา ธ ไดเร็กทอรีที่ถูกต้องสำหรับแฟล็กตัวเชื่อมโยง

หมายเหตุ: คอมไพเลอร์ C ++ (c ++) ไม่รองรับ -L ดังนั้นเราต้องใช้CMAKE_EXE_LINKER_FLAGS


3
ใช้include_directoriesแทน-Iธงไม่ดีกว่าเหรอ?
Tejas Kale

ขอบคุณมาก. ฉันวางแฟล็กตัวเชื่อมโยงCMAKE_CXX_FLAGSซึ่งทำให้ถูกละเว้น ตอนนี้ฉันวางไว้CMAKE_EXE_LINKER_FLAGSตามคำตอบของคุณแล้วพวกเขาก็ใช้งานได้ดี
Nahiyan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.