Evgenii Legotckoi
Evgenii Legotckoi09 серпня 2019 р. 18:09

Використання змінних оголошених в CMakeLists.txt всередині C++ файлів

Пропоную до розгляду варіант використання в C ++ коді змінних оголошених в CMakeLists.txt файлі.

Для початку, для чого це потрібно? Наприклад, ви хочете вказати версію програми і ще якусь службову інформацію, яка задається при складанні програми, але в той же час ви хочете використовувати цю інформацію і в вашому C++ коді? Чи можливо це зробити? Наприклад, щоб це виглядало так, як показано на малюнку.


CMakeLists.txt

Додавання таких змінних можна реалізувати через створення конфігураційного файлу з розширенням h.in в якому будуть визначені define директиви, які і додадуть констатни з CMakeLists.txt в C++. При цьому буде згенеровано відповідний заголовки.

cmake_minimum_required(VERSION 3.8)

project(VariablesProject)

# Додамо необхідні нам змінні
set (VERSION_MAJOR 0)
set (VERSION_MINOR 1)
set (VERSION_PATCH 0)
set (SOFT_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH})

# Вказуємо конфігураційний файл, з якого буде згенеровано заголовки
configure_file(config.h.in config.h @ONLY)

add_executable(${PROJECT_NAME} main.cpp)

# додаємо директорію з заголовками файлами, щоб побачити згенерований файл
include_directories(${CMAKE_CURRENT_BINARY_DIR})

config.h.in

Конфігураційний файл, з якого буде згенеровано заголовки config.h .

#ifndef CONFIG_H_IN
#define CONFIG_H_IN

#define PROJECT_NAME "@PROJECT_NAME@"    // підставляються змінні полягають в символ @
#define VERSION_MAJOR "@VERSION_MAJOR@"
#define VERSION_MINOR "@VERSION_MINOR@"
#define VERSION_PATCH "@VERSION_PATCH@"
#define SOFT_VERSION "@SOFT_VERSION@"

#endif // CONFIG_H_IN

main.cpp

#include <iostream>

#include "config.h" // Додаємо автоматично генерується конфігураційний файл

int main()
{
    // Используем переменые из CMakeLists.txt
    std::cout << "project name: " << PROJECT_NAME << std::endl;
    std::cout << "version: " << SOFT_VERSION << std::endl;
    std::cout << "version major: " << VERSION_MAJOR << std::endl;
    std::cout << "version minor: " << VERSION_MINOR << std::endl;
    std::cout << "version patch: " << VERSION_PATCH << std::endl;
    return 0;
}

Висновок програми

Отримуємо в результаті такого висновку в консолі.

project name: VariablesProject
version: 0.1.0
version major: 0
version minor: 1
version patch: 0

UPD

Файл config.h буде генеруватися в build директорії, якщо хочете його створювати в дірекеторіі вихідних кодів, то напишіть так

configure_file(config.h.in ${CMAKE_CURRENT_SOURCE_DIR}/config.h @ONLY)
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
OI
  • Ora Iro
  • 24 грудня 2024 р. 14:38

C++ - Тест 001. Первая программа и типы данных

  • Результат:40бали,
  • Рейтинг балів-8
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50бали,
  • Рейтинг балів-4
m
  • molni99
  • 26 жовтня 2024 р. 08:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80бали,
  • Рейтинг балів4
Останні коментарі
ИМ
Игорь Максимов22 листопада 2024 р. 19:51
Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 жовтня 2024 р. 21:37
Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 жовтня 2024 р. 15:19
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов05 жовтня 2024 р. 14:51
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas505 липня 2024 р. 18:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Donald Randolph
Donald Randolph30 грудня 2024 р. 10:59
Personal Injury lawyer Santa Monica As an experienced Santa Monica personal injury lawyer, Donald C. Randolph has recovered over $100 Million in verdicts and settlements for our clients. In severe injury cases, this compensation i…
Nirvana Yoga School
Nirvana Yoga School30 грудня 2024 р. 13:13
OAuth2.0 через VK, получение email Nirvana Yoga School is one of the most trusted and reputed traditional Rishikesh yoga courses , India certified by Yoga Alliance, USA. We aim to spread traditional yoga teachings so t…
s
sripark30 грудня 2024 р. 12:47
Mobile app development company in Chennai A Mobile app development company in Chennai focuses on creating personalized mobile applications to meet various business requirements. These companies offer a full range of services,…
a
amit8830 грудня 2024 р. 12:45
Excel in Exams with PSLE Maths Tuition Singapore Preparing for the PSLE can be challenging, but the right guidance makes all the difference. PSLE Maths tuition Singapore offers personalized coaching to help students master key concepts, improv…
a
awinash6230 грудня 2024 р. 12:23
Unlock Your Potential with the Certified Public Accountant Credential" Becoming a Certified Public Accountant (CPA) is a career milestone that opens doors to unparalleled opportunities in the world of accounting and finance. This globally recognized qualification s…

Слідкуйте за нами в соціальних мережах