Com o CMake, geralmente é recomendável fazer uma compilação "fora da fonte" . Crie o seu CMakeLists.txt
na raiz do seu projeto. A partir da raiz do seu projeto:
mkdir Release
cd Release
cmake -DCMAKE_BUILD_TYPE=Release ..
make
E para Debug
(novamente a partir da raiz do seu projeto):
mkdir Debug
cd Debug
cmake -DCMAKE_BUILD_TYPE=Debug ..
make
Release
/ Debug
adicionará os sinalizadores apropriados para o seu compilador. Há também RelWithDebInfo
e MinSizeRel
configurações de compilação.
Você pode modificar / adicionar aos sinalizadores especificando um arquivo de cadeia de ferramentas no qual você pode adicionar CMAKE_C_FLAGS_DEBUG
e CMAKE_C_FLAGS_RELEASE
variáveis, por exemplo:
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall")
Veja CMAKE_BUILD_TYPE para mais detalhes.
Quanto à sua terceira pergunta, não sei exatamente o que você está perguntando. O CMake deve detectar e usar automaticamente o compilador apropriado para seus diferentes arquivos de origem.
cmake -i ..
, para que o cmake seja executado interativamente, perguntando qual tipo de compilação você deseja (Nenhum, Liberar, Depurar, MinSizeRel, RelWithDebInfo).-i
opção resulta nessa mensagem de erro:The "cmake -i" wizard mode is no longer supported.
. Estou usando o cmake 3.7.13.0.0
. Referência .CMAKE_BUILD_TYPE
não estiver definido, o cmake não escolherá nenhum tipo de compilação padrão; portanto, a linha de comando do compilador gerado não corresponderá a nenhuma configuração de compilação.Para sinalizadores de depuração / liberação, consulte a
CMAKE_BUILD_TYPE
variável (você a transmite comocmake -DCMAKE_BUILD_TYPE=value
). Leva valores comoRelease
,Debug
, etc.https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/Useful-Variables#compilers-and-tools
O cmake usa a extensão para escolher o compilador, então apenas nomeie seus arquivos .c.
Você pode substituir isso por várias configurações:
Por exemplo:
Compilaria arquivos .c com g ++. O link acima também mostra como selecionar um compilador específico para C / C ++.
fonte
Em vez de manipular as
CMAKE_CXX_FLAGS
strings diretamente (o que poderia ser feito de maneira mais agradável usando ostring(APPEND CMAKE_CXX_FLAGS_DEBUG " -g3")
btw), você pode usaradd_compiler_options
:Isso adicionaria os avisos especificados a todos os tipos de compilação, mas apenas os sinalizadores de depuração fornecidos para a
DEBUG
compilação. Observe que as opções de compilação são armazenadas como uma lista do CMake, que é apenas uma string que separa seus elementos por ponto e vírgula;
.fonte
list(APPEND CMAKE_CXX_FLAGS_DEBUG "-g3")
adicionará um ponto e vírgula antes de -g3 encerrar o comando e iniciar um novo comando -g3 que certamente falhará?CMAKE_CXX_FLAGS
é uma lista cmake, mas uma sequência de sinalizadores de linha de comando separados por espaço. Acho que inconsistente comportamento ...Se você deseja construir uma configuração diferente sem gerar novamente, se estiver usando, você também pode executar
cmake --build {$PWD} --config <cfg>
Para ferramentas de configuração múltipla, escolha<cfg>
ex. Depurar, Liberar, MinSizeRel, RelWithDebInfohttps://cmake.org/cmake/help/v2.8.11/cmake.html#opt%3a--builddir
fonte
--config
opção sem nenhum resultado. Não afeta a$<CONFIG>
variável como-DCMAKE_BUILD_TYPE=
faz.// CMakeLists.txt: release
// CMakeLists.txt: debug
fonte
CMAKE_CONFIGURATION_TYPES
contenham os valores possíveis paraCMAKE_BUILD_TYPE
. Portanto, você deve definir o último como sugerem as outras respostas. Talvez sua solução funcione porque limita as opções possíveis àquela que você gostaria de ter.