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


17

我正在使用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


您是否尝试过将构建类型设置为DEBUG再次运行cmake?例如(来自“构建”目录)cmake -DCMAKE_BUILD_TYPE=DEBUG ..
steeldriver

1
为什么不将其发布在Stack Overflow上?
彼得·莫滕森

Answers:


10

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)

这会将-O0优化添加到CMake已经用于调试的标志中,并且如果您恰好使用跨平台项目,则仅包含在GCC构建中。



4

将此添加到CMakeLists.txt(项目源目录中的一个;不要触摸build目录中的任何内容):

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")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.