CMake를 사용하여 최적화없이 컴파일하는 방법 -O0


17

내가 사용하고 과학 리눅스 (SL)을. 많은 C ++ (.cpp) 파일을 사용하는 프로젝트를 컴파일하려고합니다.

디렉토리 user/project/Build에서 make모든 .cpp 파일을 컴파일하고 링크하기 위해 들어갑니다 . 그런 다음에 가서 user/run/입력해야합니다./run.sh values.txt

GDB로 디버깅하려면 user/run을 입력 gdb ../project/Build/bin/Project하고 실행해야 run -Project INPUT/inputfile.txt합니다. 그러나를 사용하여 variable 값을 인쇄하려고합니다 p variablename.

그러나 메시지가 나타납니다 s1 = <value optimized out>. 온라인에서 약간의 연구를 수행 했으며이 -O0문제를 해결하기 위해 최적화없이 컴파일해야합니다 . 하지만 어디로 들어가야합니까? 에서 CMakeLists? 그렇다면 어떤 CMakeLists입니까? project/Build또는에 하나 project/src/project?


빌드 유형을 DEBUG로 설정하여 cmake를 다시 실행 해 보셨습니까? 예 : (빌드 디렉토리에서)cmake -DCMAKE_BUILD_TYPE=DEBUG ..
steeldriver

1
왜 이것이 스택 오버플로에 게시되지 않았습니까?
Peter Mortensen

답변:


10

Chip의 대답은 도움이되었지만 SET줄을 덮어 쓰면 기본값 CMAKE_CXX_FLAGS_DEBUG이 제거되어 -g디버그 정보없이 내 실행 파일 이 작성되었습니다 . 디버깅 정보 -O0 최적화 (cmake 버전 2.8.12.2)로 빌드 된 실행 파일을 얻으려면 프로젝트 소스 디렉토리에서 CMakeLists.txt를 약간 추가로 수정해야했습니다 .

나는 추가 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)

이는 -O0CMake에서 디버그에 이미 사용 된 플래그에 최적화를 추가 하며 크로스 플랫폼 프로젝트를 사용하는 경우 GCC 빌드에만 포함됩니다.



4

이것을 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")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.