我只想调试在 Linux 上运行的一些代码,并且需要一个调试版本 (-O0 -ggdb)。所以我将这些东西添加到我的 CMakeLists.txt 文件中:
set(CMAKE_BUILD_TYPE DEBUG)
set(CMAKE_C_FLAGS "-O0 -ggdb")
set(CMAKE_C_FLAGS_DEBUG "-O0 -ggdb")
set(CMAKE_C_FLAGS_RELEASE "-O0 -ggdb")
set(CMAKE_CXX_FLAGS "-O0 -ggdb")
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "-O0 -ggdb")
当我尝试编译时,我使用
make VERBOSE=1
变得冗长
我观察了输出,像这样
... /usr/bin/c++ -D_BSD_SOURCE **-O0 -ggdb** -Wnon-virtual-dtor
-Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -Wall -W
-Wpointer-arith -Wformat-security -fno-exceptions -DQT_NO_EXCEPTIONS
-fno-check-new -fno-common -Woverloaded-virtual -fno-threadsafe-statics
-fvisibility=hidden -fvisibility-inlines-hidden **-g -O2**
-fno-reorder-blocks -fno-schedule-insns -fno-inline ...
显然代码是用“-g -O2”编译的,这不是我想要的。我怎样才能强制它只使用
"-O0 -ggdb"
?
您需要在 CMakeLists.txt 中的 project
命令之后设置标志。
此外,如果您调用
include(${QT_USE_FILE})
或
add_definitions(${QT_DEFINITIONS})
,您应该在 Qt 命令之后包含这些 set
命令,因为这些命令会附加更多标志。 如果是这种情况,您可能只想将您的标志附加到 Qt 标志上,因此更改为例如set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -ggdb")
对我来说最简单的解决方案是这样的:
CMake 会将它们添加到所有配置的标志之前。只需确保清除 CMake 缓存即可。
您必须更改 CMake
CFLAGS 默认标志。
根据CMAKE_BUILD_TYPE={DEBUG/MINSIZEREL/RELWITHDEBINFO/RELEASE}
,放入主要
CMakeLists.txt
其中一项:
对于Cset(CMAKE_C_FLAGS_DEBUG "put your flags")
set(CMAKE_C_FLAGS_MINSIZEREL "put your flags")
set(CMAKE_C_FLAGS_RELWITHDEBINFO "put your flags")
set(CMAKE_C_FLAGS_RELEASE "put your flags")
对于C++
set(CMAKE_CXX_FLAGS_DEBUG "put your flags")
set(CMAKE_CXX_FLAGS_MINSIZEREL "put your flags")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "put your flags")
set(CMAKE_CXX_FLAGS_RELEASE "put your flags")
这将覆盖
CMakeCache.txt中定义的值。base
) 和 local 包含 (/usr/local/include)进入单独的目录:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I/usr/local/include -L/usr/local/lib")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I/usr/local/include")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/local/lib")
它附加正确的目录,包括 C 和 C++ 编译器标志的路径以及链接器标志的正确目录路径。
CMAKE_EXE_LINKER_FLAGS