ฉันจะกำหนดตัวแปรตัวประมวลผลล่วงหน้าผ่าน CMake ได้อย่างไร
#define foo
รหัสเทียบเท่าจะเป็น
ฉันจะกำหนดตัวแปรตัวประมวลผลล่วงหน้าผ่าน CMake ได้อย่างไร
#define foo
รหัสเทียบเท่าจะเป็น
คำตอบ:
เป็นเวลานานที่ CMake มีadd_definitions
คำสั่งเพื่อจุดประสงค์นี้ อย่างไรก็ตามเมื่อเร็ว ๆ นี้คำสั่งถูกแทนที่ด้วยวิธีที่ละเอียดยิ่งขึ้น (คำสั่งแยกต่างหากสำหรับคำจำกัดความการคอมไพล์รวมไดเรกทอรีและตัวเลือกคอมไพเลอร์)
ตัวอย่างการใช้งานadd_compile_definitionsใหม่:
add_compile_definitions(OPENCV_VERSION=${OpenCV_VERSION})
add_compile_definitions(WITH_OPENCV2)
หรือ:
add_compile_definitions(OPENCV_VERSION=${OpenCV_VERSION} WITH_OPENCV2)
ส่วนที่ดีเกี่ยวกับเรื่องนี้ก็คือว่ามันหลีกเลี่ยงการใช้กลอุบายโทรม CMake add_definitions
มีในสถานที่สำหรับ CMake เป็นระบบที่โทรม แต่ในที่สุดพวกเขาก็พบกับความมีสติ
ค้นหาคำอธิบายเพิ่มเติมเกี่ยวกับคำสั่งที่ใช้สำหรับธงคอมไพเลอร์ได้ที่นี่: https://cmake.org/cmake/help/latest/command/add_definitions.html
ในทำนองเดียวกันคุณสามารถทำตามเป้าหมายได้ตามที่อธิบายไว้ในคำตอบของ Jim Hunziker
add_compile_definitions
CMake Error at CMakeLists.txt:6 (add_compile_definitions): Unknown CMake command "add_compile_definitions".
ต้องใช้add_compile_options(-D <your-def>)
แทน
cmake -D CMAKE_CXXFLAGS='-DDEBUG_CHESSBOARD'
(ไม่ได้ทดสอบ)
https://cmake.org/cmake/help/v3.17/command/add_compile_definitions.html#command:add_compile_definitions
และเริ่มเปลี่ยนหมายเลขเวอร์ชันลงจนกว่าหน้าจะหายไป นั่นจะเป็นรุ่นที่ยังไม่มีอยู่ ในการย้ายครั้งต่อไปคุณสามารถไปที่Whats new
ส่วนเพื่อค้นหาคำสั่งหรือคุณสมบัติใหม่ ดังนั้นมันจึงไม่ยาก
ในการทำสิ่งนี้สำหรับเป้าหมายเฉพาะคุณสามารถทำสิ่งต่อไปนี้:
target_compile_definitions(my_target PRIVATE FOO=1 BAR=1)
คุณควรทำสิ่งนี้หากคุณมีเป้าหมายมากกว่าหนึ่งเป้าหมายที่คุณกำลังสร้างและคุณไม่ต้องการให้พวกเขาทั้งหมดใช้ธงเดียวกัน ยังเห็นเอกสารอย่างเป็นทางการในtarget_compile_definitions
target_compile_definitions(my_target PRIVATE FOO=1)
แตกต่างจากset_source_files_properties(foo.cpp PROPERTIES COMPILE_DEFINITIONS -DFOO=1)
อย่างไร
target_compile_definitions
ตั้งค่าสำหรับ WHOLE executable / library โดยที่ 'set_source_files_properties` จะตั้งค่าเฉพาะไฟล์ที่ระบุเท่านั้น คำสั่ง Latter อนุญาตให้ไฟล์รวบรวมโดยใช้ภาษาอื่น set_source_files_properties(compile_me_as_objc.c PROPERTIES -x objective-c
เช่น: โปรดทราบว่า-x objective-c
นี่คือการตั้งค่าสถานะเฉพาะ GCC / Clang
วิธีการแก้ปัญหาอื่น ๆ ที่นำเสนอในหน้านี้มีประโยชน์บางรุ่น CMake
3.3.2
< นี่คือวิธีแก้ปัญหาสำหรับเวอร์ชันที่ฉันใช้ (เช่น3.3.2
) ตรวจสอบรุ่นของ Cmake ของคุณโดยใช้$ cmake --version
และเลือกโซลูชันที่เหมาะสมกับความต้องการของคุณ เอกสาร CMakeสามารถพบได้บนเว็บอย่างเป็นทางการ
ด้วย CMake เวอร์ชัน 3.3.2 เพื่อที่จะสร้าง
#define foo
ฉันต้องการใช้:
add_definitions(-Dfoo) # <--------HERE THE NEW CMAKE LINE inside CMakeLists.txt
add_executable( ....)
target_link_libraries(....)
และเพื่อให้มีนิยามแมโครของตัวประมวลผลล่วงหน้าเช่นนี้อีกอันหนึ่ง:
#define foo=5
บรรทัดถูกปรับเปลี่ยนเพื่อ:
add_definitions(-Dfoo=5) # <--------HERE THE NEW CMAKE LINE inside CMakeLists.txt
add_executable( ....)
target_link_libraries(....)
add_definitions()
target_compile_definitions()
คำสั่งที่ทันสมัยadd_compile_definitions()
กว่านั้นไม่ถูกเพิ่มจนกว่า CMake 3.12 @ Leos313