Eu só quero depurar algum código em execução no Linux e preciso de um build de depuração ( -O0 -ggdb
). Então, adicionei essas coisas ao meu 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")
Quando tentei compilar, liguei o verbose no uso make VERBOSE=1
e observei a saída, assim
... /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 ...
Aparentemente, o código é compilado "-g -O2"
e não é isso que eu quero. Como posso forçá-lo a usar "-O0 -ggdb"
apenas?
Respostas:
Você precisa definir os sinalizadores após o
project
comando em seu CMakeLists.txt.Além disso, se você estiver chamando
include(${QT_USE_FILE})
ouadd_definitions(${QT_DEFINITIONS})
, deverá incluir essesset
comandos após os do Qt, pois eles acrescentariam outros sinalizadores. Se esse é o caso, você talvez só deseja anexar suas bandeiras para as Qt, por isso a mudança para egfonte
QT_NO_EXCEPTIONS
em suas sinalizações, então estendi minha resposta um pouco. Eu estou supondo que${QT_DEFINITIONS}
está anexando o-g -O2
.set
comandos após os do Qt resolve o problema. Muito obrigado.A solução mais fácil funcionando bem para mim é esta:
CMake irá anexá-los a todos os sinalizadores de configuração. Apenas certifique-se de limpar o cache CMake.
fonte
CMAKE_CXX_FLAGS_DEBUG
etc.), então incluí-lo emCXXFLAGS
(e, portanto, injetá-lo emCMAKE_CXX_FLAGS
) não é suficiente para passar a opção para o compilador. A configuração por tipo de construção tem precedência sobre a entrada do usuário.Você deve alterar os FLAGS padrão cmake C / CXX.
De acordo com o
CMAKE_BUILD_TYPE={DEBUG/MINSIZEREL/RELWITHDEBINFO/RELEASE}
colocado no principalCMakeLists.txt
de:Para C
Para C ++
Isso substituirá os valores definidos em CMakeCache.txt
fonte
Em sistemas Unix, para vários projetos, adicionei essas linhas ao CMakeLists.txt e ele estava compilando com sucesso porque base ( / usr / include ) e inclui locais ( / usr / local / include ) vão para diretórios separados:
Ele anexa o diretório correto, incluindo caminhos para os sinalizadores do compilador C e C ++ e o caminho do diretório correto para os sinalizadores do vinculador.
Nota: o compilador C ++ (c ++) não suporta -L, então temos que usar CMAKE_EXE_LINKER_FLAGS
fonte
include_directories
vez da-I
bandeira?CMAKE_CXX_FLAGS
, o que fez com que fossem ignorados. Agora que os coloquei comCMAKE_EXE_LINKER_FLAGS
base na sua resposta, eles estão funcionando muito bem.