ความพยายามของคุณข้างต้นกำลังเพิ่มแฟล็กเพิ่มเติมให้กับไฟล์ / เป้าหมายของคุณแทนที่จะเขียนทับอย่างที่คุณคาดหวัง ตัวอย่างเช่นจากเอกสารสำหรับคุณสมบัติในไฟล์ต้นฉบับ - COMPILE_FLAGS :
แฟล็กเหล่านี้จะถูกเพิ่มลงในรายการแฟล็กคอมไพล์เมื่อไฟล์ต้นฉบับนี้สร้างขึ้น
คุณควรจะสามารถตอบโต้-Weffc++
แฟล็กสำหรับ foo.cpp ได้โดยทำ
set_source_files_properties(foo.cpp PROPERTIES COMPILE_FLAGS -Wno-effc++)
สิ่งนี้ควรมีผลจากการเพิ่ม-Wno-effc++
after -Weffc++
ในคำสั่งคอมไพลเลอร์และการตั้งค่าหลังจะชนะ หากต้องการดูคำสั่งแบบเต็มและตรวจสอบว่าเป็นกรณีนี้คุณสามารถทำได้
make VERBOSE=1
นอกจากนี้หนึ่งในผู้ดูแล GNU C ++ Standard Library ยังให้ความเห็นเชิงลบ-Weffc++
ในคำตอบนี้
อีกประเด็นหนึ่งคือคุณกำลังใช้add_definitions
ในทางที่ผิดในแง่ที่คุณกำลังใช้สิ่งนี้สำหรับแฟล็กคอมไพเลอร์แทนที่จะเป็นคำจำกัดความของตัวประมวลผลล่วงหน้าที่ตั้งใจไว้
จะนิยมใช้ add_compile_options
add_compile_options(-Wall -Weffc++ -pedantic -std=c++0x)
หรือสำหรับ CMake เวอร์ชัน <3.0 เพื่อทำสิ่งอื่น ๆ เช่น:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Weffc++ -pedantic -std=c++0x")
ในการตอบคำถามเพิ่มเติมในความคิดเห็นด้านล่างฉันเชื่อว่าเป็นไปไม่ได้ที่จะลบแฟล็กในไฟล์เดียวอย่างน่าเชื่อถือ เหตุผลก็คือสำหรับซอร์สไฟล์ใด ๆ ก็ตามจะมีCOMPILE_OPTIONS
และ1ของเป้าหมายถูกนำไปใช้ แต่สิ่งเหล่านี้ไม่ปรากฏในคุณสมบัติใด ๆ สำหรับไฟล์ต้นฉบับนั้นCOMPILE_FLAGS
คุณสามารถดูที่การแยกแฟล็กปัญหาออกจากเป้าหมายCOMPILE_OPTIONS
จากนั้นนำไปใช้กับแหล่งที่มาของเป้าหมายแต่ละแหล่งทีละรายการโดยละเว้นจากไฟล์ต้นทางเฉพาะตามต้องการ
อย่างไรก็ตามแม้ว่าสิ่งนี้สามารถใช้ได้ในหลายสถานการณ์ แต่ก็มีปัญหาอยู่สองสามประการ
เฟิร์ส - คุณสมบัติไฟล์ที่มาไม่รวมเท่านั้นCOMPILE_OPTIONS
COMPILE_FLAGS
นี่เป็นปัญหาเนื่องจากCOMPILE_OPTIONS
เป้าหมายสามารถรวมนิพจน์ตัวสร้างได้ แต่COMPILE_FLAGS
ไม่รองรับ ดังนั้นคุณจะต้องรองรับนิพจน์ตัวสร้างในขณะที่ค้นหาแฟล็กของคุณและคุณอาจต้อง "แยกวิเคราะห์" นิพจน์ตัวสร้างด้วยหากแฟล็กของคุณมีอยู่ในแฟล็กอย่างน้อยหนึ่งรายการเพื่อดูว่าควรนำไปใช้ใหม่กับส่วนที่เหลือ ไฟล์ต้นฉบับ
ประการที่สอง - ตั้งแต่ CMake v3.0 เป้าหมายสามารถระบุINTERFACE_COMPILE_OPTIONS
ได้ ซึ่งหมายความว่าการพึ่งพาของเป้าหมายของคุณสามารถเพิ่มหรือแทนที่ของเป้าหมายของคุณผ่านทางCOMPILE_OPTIONS
INTERFACE_COMPILE_OPTIONS
ดังนั้นคุณจะต้องวนซ้ำตามการอ้างอิงของเป้าหมายทั้งหมดของคุณซ้ำ (ไม่ใช่เรื่องง่ายโดยเฉพาะเนื่องจากรายการLINK_LIBRARIES
สำหรับเป้าหมายอาจมีนิพจน์ตัวสร้าง) เพื่อค้นหาสิ่งที่ใช้แฟล็กปัญหาและลองลบออกจากสิ่งเหล่านั้น เป้าหมายINTERFACE_COMPILE_OPTIONS
ด้วย
ในขั้นตอนของความซับซ้อนนี้ฉันต้องการส่งแพตช์ไปยัง CMake เพื่อมอบฟังก์ชันในการลบแฟล็กเฉพาะโดยไม่มีเงื่อนไขออกจากไฟล์ต้นฉบับ
1: โปรดทราบว่าไม่เหมือนกับCOMPILE_FLAGS
คุณสมบัติในไฟล์ต้นทางคือCOMPILE_FLAGS
คุณสมบัติในเป้าหมายจะถูกเลิกใช้งาน