Đố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>_FLAGS
là 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_options
hoạt động trên cơ sở mỗi mục tiêu (thông qua việc đặt thuộc tính COMPILE_OPTIONS
và INTERFACE_COMPILE_OPTIONS
mụ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_options
thườ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 foo
dự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}>")