Những nỗ lực của bạn ở trên đang thêm các cờ khác vào tệp / đích của bạn thay vì ghi đè như bạn mong đợi. Ví dụ: từ tài liệu dành cho Thuộc tính trên Tệp Nguồn - COMPILE_FLAGS :
Các cờ này sẽ được thêm vào danh sách các cờ biên dịch khi tệp nguồn này được tạo.
Bạn sẽ có thể chống lại -Weffc++
cờ cho foo.cpp bằng cách thực hiện
set_source_files_properties(foo.cpp PROPERTIES COMPILE_FLAGS -Wno-effc++)
Điều này sẽ có tác dụng thêm -Wno-effc++
sau -Weffc++
trong lệnh trình biên dịch và cài đặt sau sẽ thắng. Để xem toàn bộ lệnh và kiểm tra xem đây có đúng là trường hợp này không, bạn có thể làm
make VERBOSE=1
Là một sang một bên, một trong các nhà bảo trì của ++ thư viện chuẩn GNU C trình bày một quan điểm tiêu cực khá trên -Weffc++
trong câu trả lời này .
Một điểm khác là bạn đang lạm dụng add_definitions
theo nghĩa là bạn đang sử dụng điều này cho các cờ trình biên dịch hơn là các định nghĩa dành cho bộ xử lý trước.
Nó sẽ được ưu tiên sử dụng add_compile_options
add_compile_options(-Wall -Weffc++ -pedantic -std=c++0x)
hoặc đối với các phiên bản CMake <3.0 để làm điều gì đó giống như:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Weffc++ -pedantic -std=c++0x")
Để trả lời các câu hỏi khác trong phần nhận xét bên dưới, tôi tin rằng không thể xóa cờ trên một tệp một cách đáng tin cậy . Lý do là đối với bất kỳ tệp nguồn nhất định nào, nó có áp dụng COMPILE_OPTIONS
và 1 trong số các mục tiêu của nó, nhưng chúng không hiển thị trong bất kỳ thuộc tính nào của tệp nguồn đó.COMPILE_FLAGS
Bạn có thể xem xét việc loại bỏ cờ vấn đề khỏi mục tiêu COMPILE_OPTIONS
, sau đó áp dụng nó cho từng nguồn của mục tiêu riêng lẻ, bỏ qua nó khỏi tệp nguồn cụ thể theo yêu cầu.
Tuy nhiên, trong khi điều này có thể hoạt động trong nhiều trường hợp, nó có một vài vấn đề.
Thuộc tính của tệp nguồn đầu tiên không bao gồm COMPILE_OPTIONS
, chỉ COMPILE_FLAGS
. Đây là một vấn đề vì COMPILE_OPTIONS
mục tiêu có thể bao gồm các biểu thức trình tạo , nhưng COMPILE_FLAGS
không hỗ trợ chúng. Vì vậy, bạn phải điều chỉnh các biểu thức trình tạo trong khi tìm kiếm cờ của mình và thực sự bạn thậm chí có thể phải "phân tích cú pháp" các biểu thức trình tạo nếu cờ của bạn được chứa trong một hoặc nhiều để xem liệu nó có nên được áp dụng lại cho phần còn lại các tệp nguồn.
Thứ hai - kể từ CMake v3.0, các mục tiêu có thể chỉ định INTERFACE_COMPILE_OPTIONS
. Điều này có nghĩa là một phần phụ thuộc của mục tiêu của bạn có thể thêm hoặc ghi đè mục tiêu của bạn COMPILE_OPTIONS
thông qua nó INTERFACE_COMPILE_OPTIONS
. Vì vậy, bạn sẽ phải lặp lại đệ quy tất cả các phụ thuộc của mục tiêu (không phải là một nhiệm vụ đặc biệt dễ dàng vì danh sách của LINK_LIBRARIES
mục tiêu cũng có thể chứa các biểu thức trình tạo) để tìm bất kỳ biểu thức nào đang áp dụng cờ sự cố và thử xóa nó khỏi mục tiêu ' INTERFACE_COMPILE_OPTIONS
quá.
Ở giai đoạn phức tạp này, tôi đang tìm cách gửi một bản vá cho CMake để cung cấp chức năng xóa cờ cụ thể khỏi tệp nguồn một cách vô điều kiện.
1: Lưu ý rằng không giống như thuộc COMPILE_FLAGS
tính trên tệp nguồn, thuộc COMPILE_FLAGS
tính trên đích không được dùng nữa.