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
Ua

Qt - Тест 001. Сигналы и слоты

  • Результат:84бали,
  • Рейтинг балів4
Ua

Qt - Тест 001. Сигналы и слоты

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

Qt - Тест 001. Сигналы и слоты

  • Результат:47бали,
  • Рейтинг балів-6
Останні коментарі
ИМ
Игорь Максимов22 листопада 2024 р. 11:51
Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 жовтня 2024 р. 14:37
Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 жовтня 2024 р. 08:19
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов05 жовтня 2024 р. 07:51
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas505 липня 2024 р. 11:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Дмитрий
Дмитрий03 лютого 2025 р. 06:24
Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
NW
Nayo Wai30 січня 2025 р. 09:22
не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
n
nkly03 січня 2025 р. 02:52
Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
M
Marsel16 серпня 2023 р. 14:26
OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.
Evgenii Legotckoi
Evgenii Legotckoi24 червня 2024 р. 15:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.

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