나는 사용하고있다ScientificLinux(SL). 여러 개의 C++(.cpp) 파일을 사용하는 프로젝트를 컴파일하려고 합니다.
해당 디렉토리에 compile을 user/project/Build
입력 make
하고 모든 .cpp 파일을 링크합니다. 그럼 가서 user/run/
타자쳐야 지./run.sh values.txt
GDB를 사용하여 디버깅하려면 로 이동하여 user/run
입력 gdb ../project/Build/bin/Project
하고 실행해야 합니다 run -Project INPUT/inputfile.txt
. 그러나 변수 값을 인쇄하려고 합니다 p variablename
.
그러나 메시지를 받았습니다 s1 = <value optimized out>
. 온라인에서 몇 가지 조사를 했는데 -O0
이 문제를 해결하려면 최적화 없이 컴파일해야 할 것 같습니다. 그런데 어디서 입력하나요? 내부에 CMakeLists
? 그렇다면 어떤 CMakeList가 필요합니까? project/Build
아니면 중 하나 project/src/project
?
답변1
호출될 때 일반적으로 CMake를 사용하여 디버그 빌드에 필요한 것은 다음과 같습니다.
cmake -DCMAKE_BUILD_TYPE=Debug ..
이렇게 하면 -g
플래그가 추가되며 다음을 통해 확인할 수 있습니다.
make VERBOSE=1
아래에 설명된 대로 GCC 빌드 명령이 표시됩니다.https://stackoverflow.com/questions/5820303/how-do-i-force-make-gcc-to-show-me-the-commands
-O0
기본적으로 빌드에 추가되지는 않지만 Debug
아래 설명과 같이 -O0
기본값입니다 .-O
https://stackoverflow.com/questions/1778538/how-many-gcc-optimization-levels-are-there등 man gcc
이므로 일반적으로 중요하지 않습니다.
디버깅을 위해 빌드 플래그를 명시적으로 제어하려면 다음을 사용할 수도 있습니다.
cmake -DCMAKE_BUILD_TYPE=Debug
-DCMAKE_C_FLAGS_DEBUG="-g -O0" \
-DCMAKE_CXX_FLAGS_DEBUG="-g -O0" \
..
CMAKE_C_FLAGS_DEBUG
및에 대한 기본값은 다음 CMAKE_CXX_FLAGS_DEBUG
에서 찾을 수 있습니다.https://stackoverflow.com/questions/16851084/how-to-list-all-cmake-build-options-and-their-default-values그리고:
cmake -LAH .
이것은 만든다:
// Flags used by the CXX compiler during DEBUG builds.
CMAKE_CXX_FLAGS_DEBUG:STRING=-g
// Flags used by the C compiler during DEBUG builds.
CMAKE_C_FLAGS_DEBUG:STRING=-g
이 명령은 빌드 유형의 기본 동작을 명확하게 하는 다른 관심 값도 표시합니다.
// Flags used by the CXX compiler during all build types.
CMAKE_CXX_FLAGS:STRING=
// Flags used by the CXX compiler during DEBUG builds.
CMAKE_CXX_FLAGS_DEBUG:STRING=-g
// Flags used by the CXX compiler during MINSIZEREL builds.
CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG
// Flags used by the CXX compiler during RELEASE builds.
CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG
// Flags used by the CXX compiler during RELWITHDEBINFO builds.
CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG
-DCMAKE_BUILD_TYPE=Debug
전달되지 않으면 비어 CMAKE_BUILD_TYPE
있고 추가 CMAKE_CXX_FLAGS_XXX
값이 추가되지 않으므로 no 로 끝납니다 -g
.
Ubuntu 22.10, CMake 3.24.2에서 테스트되었습니다.
답변2
Chip의 답변은 도움이 되었지만 SET
해당 행이 기본값을 재정의하기 때문에 디버그 정보 없이 실행 파일이 빌드되었습니다. 디버그 정보로 빌드된 실행 파일을 얻으려면 프로젝트 소스 디렉터리의 CMakeLists.txt를 약간 추가로 수정해야 합니다.CMAKE_CXX_FLAGS_DEBUG
-g
그리고 -O0
최적화되었습니다(cmake 버전 2.8.12.2에서).
CMakeLists.txt에 다음을 추가하여 활성화된 상태를 -O0
유지했습니다 -g
.
# Add -O0 to remove optimizations when using gcc
IF(CMAKE_COMPILER_IS_GNUCC)
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0")
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0")
ENDIF(CMAKE_COMPILER_IS_GNUCC)
이는 -O0
CMake가 디버깅을 위해 이미 사용하고 있는 플래그에 최적화를 추가하며, 크로스 플랫폼 프로젝트를 사용하는 경우에만 GCC 빌드에 포함됩니다.
답변3
CMakeLists.txt(프로젝트 소스 디렉터리에 있는 항목, 빌드 디렉터리에서는 아무것도 건드리지 마세요)에 다음을 추가하세요.
SET(CMAKE_CXX_FLAGS_DEBUG "-O0")
SET(CMAKE_C_FLAGS_DEBUG "-O0")
그런 다음
$ cmake -DCMAKE_BUILD_TYPE=Debug
작동합니다. 아니면 CMakeLists.txt에 다음을 추가하세요.
SET(CMAKE_CXX_FLAGS "-O0")
SET(CMAKE_C_FLAGS "-O0")
답변4
일부 테스트에서는 CMAKE_C_FLAGS
기본적으로 일부 최적화 옵션(예 -O2
: . 이 경우 위에서 제안한 것과 유사한 작업을 수행해도 최적화가 비활성화 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0")
되지 않습니다 "-O2 -g -O0"
.
"-O#"
대신 에 간단한 정규식을 사용하여 "-O0"
.
내 정규식에는 약간의 미세 조정이 필요할 수 있지만 지금까지는 충분히 잘 작동하는 것 같습니다.
option(OPTIMIZE "Allow compiler optimizations. Set to OFF to disable" ON)
if(NOT OPTIMIZE)
string(REGEX REPLACE "(\-O[011123456789])" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
string(REGEX REPLACE "(\-O[011123456789])" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0")
endif()