Tôi chỉ muốn thêm một số thông tin cơ bản (được thảo luận ví dụ tại đây how to setup cmake_c/xx_flags per toolchain?).
Tóm lại, biến số CMAKE_<LANG>_FLAGS
được lưu trong bộ nhớ cache bằng thiết kế trong các tập lệnh CMake<Lang>Information.cmake
(nghĩa là bạn có thể thay đổi chúng trong ứng dụng GUI của CMake sau bước cấu hình).
Vì vậy, bạn phải - nếu đặt chúng trong tệp Toolchain - hãy đặt chúng trong bộ nhớ cache trước. Kịch bản riêng của CMake (được thực thi sau tệp Toolchain) không có kèm theo FORCE
, vì vậy nó sẽ không ghi đè lên nó nữa.
Hãy xem vào CMakeCInformation.cmake (từ share \ cmake-2.8 \ Modules):
set(CMAKE_C_FLAGS_INIT "$ENV{CFLAGS} ${CMAKE_C_FLAGS_INIT}")
# avoid just having a space as the initial value for the cache
if(CMAKE_C_FLAGS_INIT STREQUAL " ")
set(CMAKE_C_FLAGS_INIT)
endif()
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS_INIT}" CACHE STRING
"Flags used by the compiler during all build types.")
Như bạn thấy, cách chính thức để làm điều đó sẽ được sử dụng để tiêm CMAKE_C_FLAGS_INIT
cờ bổ sung. Vấn đề là, những thay đổi sau này trong tệp Toolchain sẽ không được nhận ra (bộ đệm sẽ không bị ghi đè, xem ở trên).
Đưa tất cả điều này vào tài khoản, giải pháp tạm thời của bạn là lựa chọn đúng đắn.Để có thực sự chắc chắn - vì các tập tin toolchain được phân tách hai lần trong Configuration/quá trình Generation - thậm chí bạn có thể thêm một cuộc gọi UNSET
trước khi thiết CMAKE_C_FLAGS
trong tập tin toolchain của bạn:
UNSET(CMAKE_C_FLAGS CACHE)
SET(CMAKE_C_FLAGS "-std=gnu99" CACHE STRING "" FORCE)
Một giải pháp thường được tìm thấy là sử dụng cái gì đó như :
add_definitions(" -std=gnu99")
để tiêm cờ biên dịch (nhưng đây không phải là định nghĩa cấu hình xây dựng, như định nghĩa biến). Xem thêm CMake clang and c++0x
Với CMake 2.8.12 đã có lệnh mới được giới thiệu, vì vậy bạn có thể làm (không dự thi, chỉ để hiển thị các khả năng):
add_compile_options("$<$<CONFIG:RELASE>:-std=gnu99>")
add_compile_options("$<$<CONFIG:DEBUG>:-std=gnu99 -g3>")
Xem What is the modern method for setting general compile flags in CMake? và CMake generator expression, differentiate C/C++ code để biết thêm về vấn đề này.
Cảm ơn bạn! Tôi đã có vấn đề chính xác này. – DouglasHeriot