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/Build
或project/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)