단일 파일에 대한 컴파일 플래그 무시
프로젝트를 컴파일하기 위해 전역 플래그 집합을 사용하고 싶습니다. 즉, 최상위 CMakeLists.txt 파일에서 다음을 지정했습니다.
ADD_DEFINITIONS ( -Wall -Weffc++ -pedantic -std=c++0x )
그러나 하위 디렉토리에있는 특정 파일 ( "foo.cpp")의 경우 컴파일 플래그를 -Weffc ++ (내가 변경할 수없는 상용 라이브러리 포함)를 적용하지 않도록 전환하고 싶습니다. -Wall 만 사용하도록 상황을 단순화하기 위해 다음을 시도했습니다.
SET_SOURCE_FILES_PROPERTIES( foo.cpp PROPERTIES COMPILE_FLAGS -Wall )
ADD_EXECUTABLE( foo foo.cpp )
, 작동하지 않았습니다. 나는 또한 시도했다
SET_PROPERTY( SOURCE foo.cpp PROPERTY COMPILE_FLAGS -Wall )
ADD_EXECUTABLE( foo foo.cpp )
과
ADD_EXECUTABLE( foo foo.cpp )
SET_TARGET_PROPERTIES( foo PROPERTIES COMPILE_FLAGS -Wall )
, 둘 다 작동하지 않았습니다.
마지막으로이 정의를 제거해 보았습니다.
REMOVE_DEFINITIONS( -Weffc++ )
ADD_EXECUTABLE( foo foo.cpp )
ADD_DEFINITIONS( -Weffc++ )
, 또한 작동하지 않았습니다 (즉, 상업 도서관에 대한 많은 스타일 경고를받습니다). (** 참고 : 실행 파일이 빌드 된 후 -Weffc ++ 지시문을 다시 포함하지 않으면 경고가 표시되지 않습니다.)
또한 일시적으로 컴파일 플래그를 제거하려고 시도했습니다 : http://www.cmake.org/pipermail/cmake/2007-June/014614.html ,하지만 도움이되지 않았습니다.
이것에 대한 우아한 해결책이 없습니까?
위의 시도는 예상대로 덮어 쓰지 않고 파일 / 대상에 플래그를 추가하는 것입니다. 예를 들어 소스 파일의 속성에 대한 문서 -COMPILE_FLAGS :
이 플래그는이 소스 파일이 빌드 될 때 컴파일 플래그 목록에 추가됩니다.
다음 -Weffc++
을 수행하여 foo.cpp에 대한 플래그 를 카운터 맨드 할 수 있어야합니다.
set_source_files_properties(foo.cpp PROPERTIES COMPILE_FLAGS -Wno-effc++)
이것은 컴파일러 명령에 -Wno-effc++
after 를 추가하는 효과가 있어야 -Weffc++
하며 후자의 설정이 우선합니다. 전체 명령을보고 이것이 사실인지 확인하려면 다음을 수행 할 수 있습니다.
make VERBOSE=1
여담는 GNU C ++ 표준 라이브러리의 관리자들 중 하나에 매우 부정적인 의견을 제시대로 -Weffc++
에서 이 답변 .
또 다른 요점은 add_definitions
의도 된 전 처리기 정의가 아닌 컴파일러 플래그에 이것을 사용하고 있다는 의미에서 오용 하고 있다는 것입니다.
사용하는 것이 바람직합니다 add_compile_options
add_compile_options(-Wall -Weffc++ -pedantic -std=c++0x)
또는 CMake 버전 <3.0의 경우 다음과 같은 작업을 수행합니다.
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Weffc++ -pedantic -std=c++0x")
아래 의견에 대한 추가 질문에 대한 응답으로 단일 파일에서 플래그 를 안정적으로 제거 하는 것은 불가능하다고 생각 합니다. 그 이유는 특정 소스 파일에 대해, 그것은을 가지고 있다는 것입니다 COMPILE_OPTIONS
및 1 목표의 적용 만이 그 소스 파일의 속성 중 하나에 표시되지 않습니다.COMPILE_FLAGS
타겟의에서 문제 플래그를 제거한 COMPILE_OPTIONS
다음 각 타겟의 소스에 개별적으로 적용하고 필요에 따라 특정 소스 파일에서 생략 할 수 있습니다.
그러나 이것은 많은 시나리오에서 작동 할 수 있지만 몇 가지 문제가 있습니다.
첫째 - 소스 파일의 속성은 포함되지 않습니다 COMPILE_OPTIONS
만 COMPILE_FLAGS
. COMPILE_OPTIONS
대상의에 생성자 표현식 이 포함될 수 있지만 COMPILE_FLAGS
지원하지 않기 때문에 이는 문제 입니다. 따라서 플래그를 검색하는 동안 생성기 표현식을 수용해야하며, 플래그가 하나 이상의 플래그에 포함 된 경우 생성기 표현식을 "파싱"하여 나머지에 다시 적용해야하는지 여부를 확인해야 할 수도 있습니다. 소스 파일.
둘째-CMake v3.0 이후 대상은 INTERFACE_COMPILE_OPTIONS
. 대상의 종속성 추가하거나 대상의를 대체 할 수있는이 수단 COMPILE_OPTIONS
의를 통해 INTERFACE_COMPILE_OPTIONS
. 따라서 LINK_LIBRARIES
문제 플래그를 적용하는 항목을 찾고 제거하기 위해 모든 대상의 종속성 (대상 목록에 생성기 표현식도 포함될 수 있으므로 특히 쉬운 작업이 아님)을 반복적으로 반복해야합니다. 목표 INTERFACE_COMPILE_OPTIONS
도.
이 복잡성 단계에서 소스 파일에서 특정 플래그를 무조건 제거하는 기능을 제공하기 위해 CMake에 패치를 제출하려고합니다.
1 : COMPILE_FLAGS
소스 파일 의 속성 과 달리 COMPILE_FLAGS
대상 의 속성은 더 이상 사용되지 않습니다.
@Fraser의 정답에 추가하기 만하면됩니다.
특정 폴더에 특수 플래그를 추가하려는 경우 다음을 수행 할 수 있습니다.
file(GLOB SPECIAL_SRC_FILES
"path/one/src/*.cpp"
"path/two/src/*.cpp")
set_property(SOURCE ${SPECIAL_SRC_FILES} PROPERTY COMPILE_FLAGS -Wno-effc++)
또는
file(GLOB SPECIAL_SRC_FILES
"path/one/src/*.cpp"
"path/two/src/*.cpp")
set_source_files_properties(${SPECIAL_SRC_FILES} PROPERTIES COMPILE_FLAGS -Wno-effc++)
여기에 설명 된대로 GLOB를 사용하지 않는 것이 좋습니다.
참고 URL : https://stackoverflow.com/questions/13638408/override-compile-flags-for-single-files
'IT story' 카테고리의 다른 글
Git 인터랙티브 리베이스 선택 커밋 없음 (0) | 2020.08.30 |
---|---|
Android Studio 3.0.0에서 데이터 바인딩 및 Kotlin을 사용하는 방법 (0) | 2020.08.30 |
Ruby / Rails-값을 변경하지 않고 시간의 시간대 변경 (0) | 2020.08.30 |
React / Redux / Typescript 알림 메시지에서 컴포넌트를 마운트 해제, 렌더링 해제 또는 제거하는 방법 (0) | 2020.08.30 |
TypeScript에서 함수의 반환 유형을 선언하는 방법 (0) | 2020.08.30 |