source

CMake에서의 디버깅과 릴리스

goodcode 2022. 8. 14. 11:59
반응형

CMake에서의 디버깅과 릴리스

GCC 컴파일 프로젝트에서는

  • 타깃 유형(디버깅/릴리스)별로 CMake를 실행하려면 어떻게 해야 합니까?
  • CMake를 사용하여 C/C++ 플래그를 디버깅 및 릴리스하려면 어떻게 해야 합니까?
  • 주요 실행 파일이 컴파일되는 것을 어떻게 표현해야 합니까?g++1개의 네스트 라이브러리가 있습니다.gcc?

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는 컴파일러에 적절한 플래그를 추가합니다.또 있다RelWithDebInfo그리고.MinSizeRel구성을 구축합니다.


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

set(CMAKE_CXX_FLAGS_DEBUG_INIT "-Wall")
set(CMAKE_CXX_FLAGS_RELEASE_INIT "-Wall")

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


세 번째 질문입니다만, 무엇을 묻고 계신지 잘 모르겠습니다.CMake는 다른 소스 파일에 적합한 컴파일러를 자동으로 검출하여 사용합니다.

여기 답변의 대부분은 최신이 아니거나 잘못되어 있습니다.그래서 더 잘 대답할 수 있도록 노력하겠습니다.물론 2020년에는 이 질문에 대답할 것이기 때문에 상황이 바뀔 것으로 예상됩니다.


타깃 유형(디버깅/릴리스)별로 CMake를 실행하려면 어떻게 해야 합니까?

우선 디버깅/릴리즈는 cmake(니트픽) 단위의 설정이라고 불립니다.

단일 구성 생성기(Ninja/Unix-Makefiles)를 사용하는 경우

그런 다음 구성별로 빌드 폴더가 필요합니다.

다음과 같이 합니다.

# Configure the build
cmake -S . -B build/Debug -D CMAKE_BUILD_TYPE=Release

# Actually build the binaries
cmake --build build/Debug

멀티 구성 제너레이터의 경우 약간 다릅니다(Ninja Multi-Config, Visual Studio).

# Configure the build
cmake -S . -B build

# Actually build the binaries
cmake --build build --config Debug

이것이 왜 필요한지 궁금하다면 cmake는 빌드 시스템이 아니기 때문입니다.메타 빌드 시스템(구축 시스템을 구축하는 빌드 시스템)입니다.이는 기본적으로 하나의 빌드로 여러 구성을 지원하는 빌드 시스템을 처리한 결과입니다.좀 더 깊이 이해하고 싶다면 크레이그 스콧의 책 "Professional CMake: A Practical Guide"에서 CMake에 대해 조금 읽어볼 것을 제안합니다.


CMake를 사용하여 C/C++ 플래그를 디버깅 및 릴리스하려면 어떻게 해야 합니까?

현대의 관습은 목표물과 속성을 사용하는 것이다.

다음은 예를 제시하겠습니다.

add_library(foobar)

# Add this compile definition for debug builds, this same logic works for
# target_compile_options, target_link_options, etc.
target_compile_definitions(foobar PRIVATE
    $<$<CONFIG:Debug>:
        FOOBAR_DEBUG=1
    >
)

메모: 제너레이터 식을 사용하여 구성을 지정하는 방법!CMAKE_BUILD_TYPE을 사용하면 다중 구성 생성기에 잘못된 빌드가 발생합니다.

게다가 경우에 따라서는, 1개의 타겟만을 대상으로 하는 것이 아니라, 글로벌하게 설정할 필요가 있습니다.add_compile_definitions, add_compile_options 등을 사용합니다.이러한 함수는 제너레이터 식을 지원합니다.꼭 해야 할 때가 아니면 구식 크메이크를 사용하지 마라(그 길은 악몽의 땅이다).


메인 실행 파일이 g++로 컴파일되고 하나의 네스트 라이브러리가 gcc로 컴파일된다는 것을 어떻게 표현해야 합니까?

당신의 마지막 질문은 정말 말이 안 돼요.

디버깅 플래그에 는, 「」/「」를 .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++용 컴파일러를 선택하는 방법도 보여 줍니다.

, 「」를 조작합니다.CMAKE_CXX_FLAGS 스트링더 잘 할수 것)string(APPEND CMAKE_CXX_FLAGS_DEBUG " -g3")를하면 됩니다.add_compile_options:

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

빌드유형에만 "Debugging Flags" 에 됩니다.DEBUG목록으로 저장됩니다.입니다.;.

하고 있는 , 않고 다른 는, 「」를 실행할 .cmake --build {$PWD} --config <cfg>도구의 경우 [Da's ]를합니다.<cfg> Debug, MinSizeRel,: ", ", MinSizeRel, RelWithDebInfo"

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

// CMake Lists.txt : 릴리즈

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

// CMake Lists.txt : 디버깅

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

언급URL : https://stackoverflow.com/questions/7724569/debug-vs-release-in-cmake

반응형