Última atualização:2026-10-12
CMake: introdução e prática¶
Fundamentos essenciais do CMake (parte 1)¶
1. Definir as flags do compilador¶
Por exemplo: definir o padrão C++ e exibir todos os avisos.
set(CMAKE_CXX_FLAGS "-std=c++0x -Wall")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -Wall")
add_compile_options("$<$<STREQUAL:$<TARGET_PROPERTY:LINKER_LANGUAGE>,CXX>:-std=c++11>")
Também é possível definir algumas flags de otimização
Documentação oficial: https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
Por exemplo:
Se você usar LLVM, pode consultar aqui:
2. Definir propriedades dos arquivos-fonte¶
Esta é uma funcionalidade complexa do CMake: se existirem vários alvos, pode ser necessário alterar o comportamento de um deles. Por exemplo, se você quiser compilar o main.cpp usando C++11, mas compilar apenas a biblioteca em C++14, pode usar o comando set_source_files_properties para configurar as propriedades de arquivos-fonte específicos, conforme mostrado abaixo:
cmakeCopy code
set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/*.cpp PROPERTIES COMPILE_FLAGS "-std=c++11")
No manual a seguir é possível consultar inúmeras propriedades, e cada uma delas pode ser usada para atender às suas necessidades específicas.
https://cmake.org/cmake/help/v3.3/manual/cmake-properties.7.html#source-file-properties
3. Flags do vinculador¶
A seguir está uma lista de flags do vinculador do GNU GCC.
Opções de vinculação do GNU GCC
Por padrão, o vinculador do GCC pode buscar nos diretórios definidos em variáveis de ambiente (/usr/lib;/usr/local/lib) e, em seguida, vincular as bibliotecas padrão.
Uma das flags mais comuns é -l, usada para vincular as bibliotecas necessárias, como -lzlib, -lboost, entre outras.
Há outras flags adicionais que podem ajudá-lo a alterar o comportamento das opções de vinculação do executável.
Estas são as variáveis às quais você pode adicionar flags do vinculador:
CMAKE_EXE_LINKER_FLAGS: flags usadas pelo vinculador ao criar um executávelCMAKE_EXE_LINKER_FLAGS_RELEASE: flags usadas pelo vinculador ao criar um executável da versão de lançamento (release)CMAKE_EXE_LINKER_FLAGS_DEBUG: flags usadas pelo vinculador ao criar um executável da versão de depuração (debug)CMAKE_STATIC_LINKER_FLAGS: flags usadas ao criar uma biblioteca estática (.a, .lib)CMAKE_SHARED_LINKER_FLAGS: flags usadas ao criar uma biblioteca compartilhada (.so, .dll)CMAKE_MODULE_LINKER_FLAGS: flags usadas ao criar uma biblioteca de módulo
Por exemplo, você pode adicionar flags do vinculador com o seguinte código:
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl")
Saber usar essas flags pode ajudá-lo a controlar melhor o comportamento de vinculação do executável.
4. Pacotes Debug e Release¶
Dentro do arquivo CMakeLists.txt, é possível acessar CMAKE_BUILD_TYPE. Você pode verificar facilmente o tipo de compilação no CMakeLists.txt:
if(${CMAKE_BUILD_TYPE} MATCHES Debug)
message("Debug Build")
elseif(${CMAKE_BUILD_TYPE} MATCHES Release)
message("Release Build")
endif()
Você também pode usar as variáveis de configuração mostradas na seção anterior para definir separadamente as flags do compilador e do vinculador para os diferentes tipos de compilação:
- CMAKE_EXE_LINKER_FLAGS_RELEASE: flags usadas para criar executáveis da versão de lançamento (release)
- CMAKE_EXE_LINKER_FLAGS_DEBUG: flags usadas para criar executáveis da versão de depuração (debug)
- CMAKE_CXX_FLAGS_RELEASE
- CMAKE_CXX_FLAGS_DEBUG
Tópicos relacionados¶
- Construindo projetos C++ com Bazel | C++那些事
- Depuração conjunta de Bazel e LLDB | C++那些事
- Introdução ao gerenciamento de pacotes C++ com Conan | C++那些事
- C++ Insights: observação em tempo de compilação | C++那些事
- C++ interativo com Jupyter Notebook | C++那些事
- Converter string para int em C++ | C++那些事
- Macro de depuração dbg-macro em C++ | C++那些事
- Opções de compilação do GCC em detalhes | C++那些事
- Depuração de programas C++ com GDB | C++那些事
- Depuração estendida com Python no GDB | C++那些事