Đối với CMake hiện đại (phiên bản 2.8.12 trở lên), bạn nên sử dụng target_compile_options, sử dụng thuộc tính đích bên trong.
CMAKE_<LANG>_FLAGSlà một biến toàn cục và dễ xảy ra lỗi nhất khi sử dụng. Nó cũng không hỗ trợ các biểu thức trình tạo , điều này có thể rất hữu ích.
add_compile_options dựa trên thuộc tính thư mục, điều này tốt trong một số trường hợp, nhưng thường không phải là cách tự nhiên nhất để chỉ định các tùy chọn.
target_compile_optionshoạt động trên cơ sở mỗi mục tiêu (thông qua việc đặt thuộc tính COMPILE_OPTIONSvà INTERFACE_COMPILE_OPTIONSmục tiêu), thường dẫn đến mã CMake sạch nhất, vì các tùy chọn biên dịch cho tệp nguồn được xác định theo dự án mà tệp đó thuộc về (chứ không phải là thư mục mà nó được đặt trên đĩa cứng). Điều này có lợi thế bổ sung là nó tự động xử lý các tùy chọn chuyển đến các mục tiêu phụ thuộc nếu được yêu cầu.
Mặc dù chúng dài dòng hơn một chút, các lệnh cho mỗi mục tiêu cho phép kiểm soát chi tiết hợp lý đối với các tùy chọn xây dựng khác nhau và (theo kinh nghiệm cá nhân của tôi) ít gây đau đầu nhất về lâu dài.
Về lý thuyết, bạn cũng có thể đặt các thuộc tính tương ứng trực tiếp bằng cách sử dụng set_target_properties, nhưng target_compile_optionsthường dễ đọc hơn.
Ví dụ: để đặt các tùy chọn biên dịch của một mục tiêu foodựa trên cấu hình bằng cách sử dụng các biểu thức trình tạo, bạn có thể viết:
target_compile_options(foo PUBLIC "$<$<CONFIG:DEBUG>:${MY_DEBUG_OPTIONS}>")
target_compile_options(foo PUBLIC "$<$<CONFIG:RELEASE>:${MY_RELEASE_OPTIONS}>")