CMake를 사용하여 CFLAGS 및 CXXFLAGS 옵션 설정


88

Linux에서 실행되는 일부 코드를 디버깅하고 디버그 빌드 ( -O0 -ggdb) 가 필요합니다 . 그래서 다음 항목을 내 CMakeLists.txt:

set(CMAKE_BUILD_TYPE DEBUG)
set(CMAKE_C_FLAGS "-O0 -ggdb")
set(CMAKE_C_FLAGS_DEBUG "-O0 -ggdb")
set(CMAKE_C_FLAGS_RELEASE "-O0 -ggdb")
set(CMAKE_CXX_FLAGS "-O0 -ggdb")
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "-O0 -ggdb")

컴파일을하려고 할 때 사용을 자세히 설정하고 다음 make VERBOSE=1 과 같이 출력을 관찰했습니다.

... /usr/bin/c++ -D_BSD_SOURCE **-O0 -ggdb** -Wnon-virtual-dtor 
-Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -Wall -W 
-Wpointer-arith -Wformat-security -fno-exceptions -DQT_NO_EXCEPTIONS 
-fno-check-new -fno-common -Woverloaded-virtual -fno-threadsafe-statics 
-fvisibility=hidden -fvisibility-inlines-hidden **-g -O2** 
-fno-reorder-blocks -fno-schedule-insns -fno-inline ...

분명히 코드가 컴파일 "-g -O2"되고 이것은 내가 원하는 것이 아닙니다. 강제로 사용하려면 어떻게 "-O0 -ggdb"해야합니까?


1
디버깅 가능한 빌드를 원하면 명령 줄에서 디버그 구성을 수행하면됩니다. "cmake -DCMAKE_BUILD_TYPE = 디버그". 결과 빌드에는 지정된 빌드 시스템에 대한 디버그 플래그가 있습니다. cmake 파일 자체를 수정할 이유가 없습니다. 다른 -D 인수와 함께 CMAKE_C_FLAGS 값을 보낼 수도 있습니다.
Atifm

답변:


83

CMakeLists.txt 의 명령어 뒤에 플래그를 설정해야합니다 project.

또한 include(${QT_USE_FILE})또는을 호출하는 경우 추가 플래그를 추가하므로 Qt 명령 뒤에 add_definitions(${QT_DEFINITIONS})이러한 set명령을 포함해야 합니다. 그 경우 경우를, 당신은 어쩌면 그냥, Qt는 것들에 플래그를 추가 할 예로 변경 때문에

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -ggdb")

나는 프로젝트 명령 뒤에 그 깃발을 넣었다. 그러나 출력은 동일합니다.
majie

방금 QT_NO_EXCEPTIONS귀하의 깃발 에서을 발견 했으므로 대답을 조금 확장했습니다. 나는 그 추측하고있어 ${QT_DEFINITIONS}를 추가한다 -g -O2.
Fraser

1
네, 맞습니다. setQt 명령 뒤에 해당 명령을 넣으면 문제가 해결됩니다. 대단히 감사합니다.
majie 2014

18

나를 위해 잘 작동하는 가장 쉬운 솔루션은 다음과 같습니다.

export CFLAGS=-ggdb
export CXXFLAGS=-ggdb

CMake는이를 모든 구성의 플래그에 추가합니다. CMake 캐시를 지우십시오.


3
이와 같은 환경에서 플래그를 설정하는 것이 CMakeLists.txt를 수정하지 않고 수행 할 수있는 유일한 방법입니다. 환경 값은 첫 번째 구성에서만 읽은 다음 캐시에 저장되므로이를 변경하려면 CMake 캐시를 지우고 환경의 새 값으로 구성 단계를 다시 실행해야합니다. 문서 : cmake.org/cmake/help/latest/envvar/CFLAGS.html cmake.org/cmake/help/latest/envvar/CXXFLAGS.html
bleater

3
그것은 "가장 쉬운"것이 아니라 그것을하는 유일한 올바른 방법입니다.
Slava

생성기가 특정 빌드 유형 (예 : CMAKE_CXX_FLAGS_DEBUG 등) 에 대해 특정 플래그를 구성하는 경우 사소한 문제가 발생하면이 를 포함하여에 CXXFLAGS삽입하는 것만으로 CMAKE_CXX_FLAGS는 실제로 옵션을 컴파일러에 전달하는 데 충분하지 않습니다. 빌드 유형별 구성이 사용자 입력보다 우선합니다.
Ext3h

15

cmake C / CXX 기본 FLAGS를 변경해야합니다.

다음 중 CMAKE_BUILD_TYPE={DEBUG/MINSIZEREL/RELWITHDEBINFO/RELEASE} 주요 항목 에 넣으십시오 CMakeLists.txt.

C 용

set(CMAKE_C_FLAGS_DEBUG "put your flags")
set(CMAKE_C_FLAGS_MINSIZEREL "put your flags")
set(CMAKE_C_FLAGS_RELWITHDEBINFO "put your flags")
set(CMAKE_C_FLAGS_RELEASE "put your flags")

C ++의 경우

set(CMAKE_CXX_FLAGS_DEBUG "put your flags")
set(CMAKE_CXX_FLAGS_MINSIZEREL "put your flags")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "put your flags")
set(CMAKE_CXX_FLAGS_RELEASE "put your flags")

이것은 CMakeCache.txt에 정의 된 값을 재정의합니다.


현재의 cmake 플래그를 재정의합니다. -g 플래그를 직접 추가하지 않으면 디버깅이 중단됩니다 (gcc)
activedecay

"Modern Cmake"구문을 사용하는 것과 같은 생각이 있습니까?
Sandburg

6

Unix 시스템에서 여러 프로젝트의 경우 이러한 행을 CMakeLists.txt에 추가했으며 기본 ( / usr / include ) 및 로컬 포함 ( / usr / local / include )이 분리 된 디렉토리로 이동 하기 때문에 성공적으로 컴파일되었습니다 .

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I/usr/local/include -L/usr/local/lib")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I/usr/local/include")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/local/lib")

C 및 C ++ 컴파일러 플래그에 대한 경로와 링커 플래그에 대한 올바른 디렉터리 경로를 포함하여 올바른 디렉터리를 추가합니다.

참고 : C ++ 컴파일러 (c ++)는 -L을 지원하지 않으므로 CMAKE_EXE_LINKER_FLAGS 를 사용해야 합니다.


3
깃발 include_directories대신 사용 하는 것이 더 낫지 -I않습니까?
Tejas Kale

정말 고맙습니다. 링커 플래그를에 배치 CMAKE_CXX_FLAGS했는데 이로 인해 무시되었습니다. 이제 CMAKE_EXE_LINKER_FLAGS귀하의 답변 에 따라 배치 했으므로 정상적으로 작동합니다.
Nahiyan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.