CMake의 디버그 및 릴리스


436

GCC 컴파일 프로젝트에서

  • 각 대상 유형 (디버그 / 릴리스)에 대해 CMake를 어떻게 실행합니까?
  • CMake를 사용하여 디버그 및 릴리스 C / C ++ 플래그를 어떻게 지정합니까?
  • 주 실행 파일이 컴파일 g++되고 중첩 라이브러리가 하나 있음을 어떻게 표현 gcc합니까?

답변:


658

CMake를 사용하는 경우 일반적으로 "소스 외부"빌드 를 수행하는 것이 좋습니다 . CMakeLists.txt프로젝트의 루트에서을 만드십시오 . 그런 다음 프로젝트의 루트에서 :

mkdir Release
cd Release
cmake -DCMAKE_BUILD_TYPE=Release ..
make

그리고 Debug(프로젝트의 뿌리에서 다시) :

mkdir Debug
cd Debug
cmake -DCMAKE_BUILD_TYPE=Debug ..
make

Release/ Debug는 컴파일러에 적절한 플래그를 추가합니다. 도 있습니다 RelWithDebInfoMinSizeRel빌드 구성.


다음 과 같이 변수 와 변수를 추가 할 수 있는 툴체인 파일 을 지정하여 플래그를 수정 / 추가 할 수 있습니다 .CMAKE_C_FLAGS_DEBUGCMAKE_C_FLAGS_RELEASE

set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall")

자세한 내용은 CMAKE_BUILD_TYPE 을 참조하십시오.


세 번째 질문은 정확히 무엇을 요구하는지 잘 모르겠습니다. CMake는 다른 소스 파일에 적합한 컴파일러를 자동으로 감지하고 사용해야합니다.


3
당신도 할 수 있습니다 cmake -i ..cmake가 대화 형으로 실행됩니다, 그래서 당신이 원하는 빌드의 유형을 묻는 대신 (없음, 릴리스, 디버그, MinSizeRel, RelWithDebInfo).
thiagowfx 2016

5
@thiagowfx -i옵션을 사용하면 다음과 같은 오류 메시지가 나타납니다 The "cmake -i" wizard mode is no longer supported.. 저는 cmake 3.7.1을 사용하고 있습니다
Philipp Claßen

3
좋은 관찰. version 이후로 더 이상 사용되지 않는 것 같습니다 3.0.0. 참조 .
thiagowfx

7
서브 디렉토리를 작성하는 경우 소스 빌드가 아닙니다! 소스 디렉토리 외부 / 위에 빌드 디렉토리를 작성하는 것이 좋습니다.
Victor Lamoine

CMAKE_BUILD_TYPE설정되지 않은 경우 cmake는 기본 빌드 유형을 선택하지 않으므로 생성 된 컴파일러 명령 행이 빌드 구성과 일치하지 않습니다.
david

23

디버그 / 릴리스 플래그에 대해서는 CMAKE_BUILD_TYPE변수를 참조하십시오 (로 전달 cmake -DCMAKE_BUILD_TYPE=value). 이 같은 값을 얻어 Release, Debug

https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/Useful-Variables#compilers-and-tools

cmake는 확장자를 사용하여 컴파일러를 선택하므로 파일 이름을 .c로 지정하십시오.

다양한 설정으로이를 무시할 수 있습니다.

예를 들면 다음과 같습니다.

set_source_files_properties(yourfile.c LANGUAGE CXX) 

g ++로 .c 파일을 컴파일합니다. 위의 링크는 C / C ++ 용 특정 컴파일러를 선택하는 방법도 보여줍니다.


16

CMAKE_CXX_FLAGS문자열을 직접 조작하는 대신 ( string(APPEND CMAKE_CXX_FLAGS_DEBUG " -g3")btw를 사용하여 더 잘 수행 할 수 있음 ) 다음을 사용할 수 있습니다 add_compiler_options.

add_compile_options(
  "-Wall" "-Wpedantic" "-Wextra" "-fexceptions"
  "$<$<CONFIG:DEBUG>:-O0;-g3;-ggdb>"
)

이렇게하면 지정된 경고가 모든 빌드 유형에 추가되지만 지정된 디버깅 플래그 만 DEBUG빌드에 추가됩니다. 컴파일 옵션은 CMake 목록으로 저장되는데, 이는 세미콜론으로 요소를 구분하는 문자열 일뿐 ;입니다.


2
하지 않음 list(APPEND CMAKE_CXX_FLAGS_DEBUG "-g3")-g3 명령과 반드시 실패합니다 새 명령 -g3 시작을 종료하기 전에 세미콜론을 추가?
cburn11

당신 말이 맞아 CMAKE_CXX_FLAGS입니다 하지 cmake리스트 만 공백으로 구분 된 명령 행 플래그의 문자열입니다. 나는 ... 그 행동의 일관성을 찾을
바스 챤

add_compile_options ()는 깔끔합니다. -fsanitize = address와 같이 링커에 옵션을 추가해야하는 경우 add_link_options ()로 보완됩니다.
Bowie Owens

1
이것이 2020 / cmake 3.17에서 여전히 적절한 방법입니까? 마지막 줄은 불쾌 해 보입니다
Jay

8

cmake --build {$PWD} --config <cfg>다중 구성 도구의 경우 다음 을 실행할 수도있는 경우 재생성하지 않고 다른 구성을 구축하려면 <cfg>ex를 선택하십시오 . 디버그, 릴리스, MinSizeRel, RelWithDebInfo

https://cmake.org/cmake/help/v2.8.11/cmake.html#opt%3a--builddir


나는 --config아무런 결과없이 옵션을 가지고 놀려고했습니다. $<CONFIG>변수는 영향을 미치지 -DCMAKE_BUILD_TYPE=않습니다.
loshad vtapkah

5

// CMakeLists.txt : 출시

set(CMAKE_CONFIGURATION_TYPES "Release" CACHE STRING "" FORCE)

// CMakeLists.txt : 디버그

set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE)

10
나는 이것이 왜 투표에 실패했는지 이해하지 못한다. 생산에 사용되는 실제 코드이다.
sailfish009

5
CMake 문서 CMAKE_CONFIGURATION_TYPES에 따라 가능한 값이 포함되어 있기 때문일 수 있습니다 CMAKE_BUILD_TYPE. 따라서 다른 답변에서 제안한대로 후자를 설정해야합니다. 어쩌면 귀하의 솔루션은 가능한 선택을 원하는 것으로 제한하기 때문에 효과가있을 수 있습니다.
bjhend

2
이것이 효과가 있기 때문에 공감하십시오. 나는 CMake를 좋아하지만 기발한 점이 있으며 때로는 작동하기 위해 큰 망치를 사용해야합니다. 어떤 이유로 든 명령 줄 플래그를 거부하는 프로젝트가 있습니다.
cory.todd

설정이 작동하지 않는 이유에 대한 추가 정보는 다음과 같습니다. stackoverflow.com/a/24470998/3196753
tresf
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.