Post

Como Começar no CMake para Compilar em C e C++

CMakeFiles.txt

Para compilar um programa com Cmake, crie um arquivo CMakeFiles.txt na raiz do projeto.

Este arquivo deve conter:

Versão minima que a maquina deve ter para compilar

1
cmake_minimum_required(VERSION 3.2)

Nome do projeto.

1
project(gcm)

Para imprimir textos podemos usar o message:

1
2
message("SDL Libraries: ${SDL2_LIBRARIES}")
message("SDL Includes: ${SDL2_INCLUDE_DIRS}")

É possível criar um BuildConfig file injetando variáveis em compile-time. Para isso, defina o nome e o valor da variável.

1
2
3
4
# exemplos
set(GCM_VERSION_MAJOR 1)
set(GCM_VERSION_MINOR 0)
set(GCM_VERSION_PATCH 0)

Agora, define o arquivo que de origem na extensão .in que conterá as variáveis no formato @var_name@ e o arquivo de destino onde será gerado. Semlhante à um BuildConfig file

1
2
3
4
5
# As variaveis PROJECT_SOURCE_DIR e PROJECT_BINARY_DIR são padrões do cmake
configure_file(
  "${PROJECT_SOURCE_DIR}/version.h.in"
  "${PROJECT_BINARY_DIR}/version.h"
  )

Pode ser usado um diretório diferente para que o cmake escreva o novo arquivo com os valores atribuídos OU usar o diretório binário e depois atribuir o diretório como include.

1
2
# incluir os headers file na hora do build
include_directories("${PROJECT_BINARY_DIR}")

Para definir o nome do executável e os arquivos *.cpp que entrarão no build.

1
add_executable(gcm main.cpp)

Libraries

Para incluir uma library externa, primeiro precisamos descobrir se ela existe. Com REQUIRED, obrigamos que a compilação somente passe se tiver a library.

1
find_package(SDL2 REQUIRED)

Agora, devemos incluir os headers junto ao binário.

1
2
3
4
include_directories(
    # "${PROJECT_BINARY_DIR}"
    ${SDL2_INCLUDE_DIRS}
)

E por último, incluir a library em si no executável para que o linker possa trabalhar.

1
2
3
4
target_link_libraries(
  gcm
  ${SDL2_LIBRARIES}
)

Exemplos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
cmake_minimum_required(VERSION 3.2)
project(gcm)

# Para criar BuildConfig files injetando variáveis em compile-time
# 1. Defina o nome e o valor da variável
set(GCM_VERSION_MAJOR 1)
set(GCM_VERSION_MINOR 0)
set(GCM_VERSION_PATCH 0)

# 2. Define o arquivo que de origem na extensão .in que conterá
# as variáveis no formato @var_name@ e o arquivo de destino onde
# será gerado.
# Idem BuildConfig
configure_file(
  "${PROJECT_SOURCE_DIR}/version.h.in"
  "${PROJECT_BINARY_DIR}/version.h"
  )


include_directories(
    "${PROJECT_BINARY_DIR}"
    ${SDL2_INCLUDE_DIRS}
)

add_executable(gcm main.cpp)

# Inclui as dependencias
target_link_libraries(gcm
    ${SDL2_LIBRARIES}
)
1
2
3
4
// version.h.in
#define VERSION_MAJOR @GCM_VERSION_MAJOR@
#define VERSION_MINOR @GCM_VERSION_MINOR@
#define VERSION_PATCH @GCM_VERSION_PATCH@
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// main.cpp
#include <iostream>
#include "version.h"

void version()
{
    std::cout << "Version : " <<
        VERSION_MAJOR << "." <<
        VERSION_MINOR << "." <<
        VERSION_PATCH << std::endl;
}

int main(int argc, char **argv)
{
    version();

    std::cout << "Hello C++!"  << std::endl;

    return 0;
}
Esta postagem está licenciada sob CC BY 4.0 pelo autor.