如何使用 CMake 在没有优化的情况下进行编译 -O0

use*_*158 20 debugging gdb cmake optimization

我正在使用Scientific Linux (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. 但是,我正在尝试使用p variablename.

但是,我收到了消息s1 = <value optimized out>。我在网上做了一些研究,似乎我需要在没有优化的情况下编译-O0来解决这个问题。但是我在哪里输入呢?在CMakeLists?如果是这样,哪些 CMakeLists ?在project/Buildproject/src/project?

小智 12

Chip 的回答很有帮助,但是由于该SET行覆盖了CMAKE_CXX_FLAGS_DEBUG这删除了-g导致我的可执行文件在没有调试信息的情况下构建的默认值。我需要对项目源目录中的 CMakeLists.txt 进行一些小的额外修改,以获得使用调试信息 -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)
Run Code Online (Sandbox Code Playgroud)

这将-O0优化已用于 CMake 调试的标志,并且仅在您碰巧使用跨平台项目时才包含在 GCC 构建中。


Cir*_*郝海东 11

或者在调用时:

cmake -DCMAKE_BUILD_TYPE=DEBUG \
      -DCMAKE_C_FLAGS_DEBUG="-g -O0" \
      -DCMAKE_CXX_FLAGS_DEBUG="-g -O0"
Run Code Online (Sandbox Code Playgroud)

然后确认:

make VERBOSE=1
Run Code Online (Sandbox Code Playgroud)

显示 GCC 构建命令,如下所述:https : //stackoverflow.com/questions/5820303/how-do-i-force-make-gcc-to-show-me-the-commands

在 Ubuntu 17.04、CMake 3.7.2 上测试。


小智 5

将此添加到 CMakeLists.txt(项目源目录中的那个;不要触及构建目录中的任何内容):

SET(CMAKE_CXX_FLAGS_DEBUG "-O0")
SET(CMAKE_C_FLAGS_DEBUG "-O0")
Run Code Online (Sandbox Code Playgroud)

进而

$ cmake -DCMAKE_BUILD_TYPE=Debug
Run Code Online (Sandbox Code Playgroud)

将工作。或者,只需将其添加到 CMakeLists.txt:

SET(CMAKE_CXX_FLAGS "-O0")
SET(CMAKE_C_FLAGS "-O0")
Run Code Online (Sandbox Code Playgroud)