Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
И тут вот те нате
322 / 209 / 117
Регистрация: 12.07.2016
Сообщений: 555

Code::Blocks + cmake

14.02.2023, 01:28. Показов 3603. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Решил разобраться с системами сборок в целом и с CMake в частности, для этого попытался прикрутить его к IDE CodeBlocks. Структура тестового проекта такая:
Кликните здесь для просмотра всего текста
testCmake1
|
|- CMakeLists.txt
|- main.cpp
|- inc
...|- options.h

CMakeLists.txt:
Кликните здесь для просмотра всего текста
CMAKE_MINIMUM_REQUIRED (VERSION 3.10)

include_directories( inc/ )
set( SRC main.cpp )

project ( Test_prj )
add_executable ( test ${SRC} )

Также в опциях проекта Build options... - Pre-build steps я написал
Code
1
2
cmake -S . -B build -G "MinGW Makefiles"
make -C build
main.cpp:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
 
#include "options.h"
 
int main()
{
    cout<<"Hello "<< MY_NUM << endl;
 
    system("pause");
    return 0;
}

Далее, когда я запускаю сборку, скрипты из Pre-build steps успешно выполняются:
Кликните здесь для просмотра всего текста
Running project pre-build steps
cmake -S . -B build -G "MinGW Makefiles"
make -C build
-- The C compiler identification is GNU 8.1.0
-- The CXX compiler identification is GNU 8.1.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: C:/Program Files (x86)/CodeBlocks/MinGW/bin/gcc.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files (x86)/CodeBlocks/MinGW/bin/c++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done (0.9s)
-- Generating done (0.0s)
-- Build files have been written to: C:/Projects/C_Projects/testCmake1/build
make: Entering directory 'C:/Projects/C_Projects/testCmake1/build'
make[1]: Entering directory 'C:/Projects/C_Projects/testCmake1/build'
make[2]: Entering directory 'C:/Projects/C_Projects/testCmake1/build'
make[2]: Leaving directory 'C:/Projects/C_Projects/testCmake1/build'
make[2]: Entering directory 'C:/Projects/C_Projects/testCmake1/build'
[ 50%] Building CXX object CMakeFiles/test.dir/main.cpp.obj
[100%] Linking CXX executable test.exe
make[2]: Leaving directory 'C:/Projects/C_Projects/testCmake1/build'
[100%] Built target test
make[1]: Leaving directory 'C:/Projects/C_Projects/testCmake1/build'
make: Leaving directory 'C:/Projects/C_Projects/testCmake1/build'

По итогу я получаю в папке build свой исполняемый файл test.exe и тут начинаются первые проблемы. Если этот файл попробовать запустить, то сразу ошибка - 0xC000007B. Как-то я уже с ней сталкивался в другом контексте, по-моему это ошибка в подключаемой системной библиотеке. Но странно другое, если выполнить те же скрипты из Pre-build steps вручную через командную строку, то test.exe собирается и работает нормально. Интересно также, что при сборке из CB test.exe получается 56 кб (с ошибкой), а при запуске команд вручную - 51 кб (рабочий файл).
Дальше я хочу дебажить свой проект на CMake из CodeBlocks. Насколько я понимаю, Pre-build steps сейчас полностью собирают мой проект до .exe файла т.е. CB нужно только запускать его, но тут я сталкиваюсь со второй проблемой. После выполнения Pre-build, CB начинает сам снова собирать проект, будто никакого CMake у меня и нет:
Code
1
2
g++.exe -Wall -g -std=c++17  -c C:\Projects\C_Projects\testCmake1\main.cpp -o obj\Debug\main.o
g++.exe  -o bin\test.exe obj\Debug\main.o
На этом этапе g++ выдает ошибку, что он не находит #include "options.h" из main.cpp. Ошибку можно обойти, если написать #include "inc/options.h", но я ведь специально прописывал include_directories( inc/ ) в CMakeLists.txt, почему CB это не видит?
Также я облазил все настройки, но не нашел, где конфигурируется стандартная команда сборки для проекта g++.exe -Wall -g .... Если в настройках проекта указать "Custom Makefile", то среда выдаст другую команду сборки: mingw32-make.exe -q -f Makefile Debug Эта команда может не выполниться т.к. Debug тут является целью сборки и это имя должно совпадать с "test" из add_executable ( test ${SRC} ).
Подведу итог, вопросы следующие:
1. Почему при одинаковых командах сборки получается разный результат из CB и из командной строки?
2. Где в CB править стандартную команду сборки проекта? Можно ли вообще отключить стандартную сборку, если все и собирается внешними инструментами?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.02.2023, 01:28
Ответы с готовыми решениями:

Code::Blocks
Здравствуйте. Я в английском не силён, и разобраться самостоятельно с этой IDE не могу. У меня есть несколько вкладок с открытыми *.cpp...

Code::blocks
Помогите как включить #include &lt;graphics.h&gt; #include &lt;windows.h&gt; в Code::block - се ,

MS VS in CODE BLOCKS
Делал проекты в VISUAL C++ EXPRESS. Сеичас пересел на LINUX, пользуюсь CODE BLOCKS . Есть какие-нибудь варианты как открыть проекты...

10
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
14.02.2023, 11:38
Цитата Сообщение от Evgen173 Посмотреть сообщение
Решил разобраться с системами сборок в целом и с CMake в частности, для этого попытался прикрутить его к IDE CodeBlocks.
Зачем "прикрурутить"? Интеграция вроде как не предусмотрена.
Однако CMake умеет генерировать файлы проекта для CB. Нужно только указать -G "CodeBlocks - MinGW Makefiles", например.
0
Модератор
Эксперт Java
 Аватар для alecss131
2862 / 1368 / 409
Регистрация: 11.08.2017
Сообщений: 4,389
Записей в блоге: 2
14.02.2023, 11:42
Цитата Сообщение от Evgen173 Посмотреть сообщение
CMakeLists.txt
Правильнее будет так
Code
1
2
3
4
5
6
7
8
9
cmake_minimum_required(VERSION 3.15)
project(Test_prj)
 
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
 
set(SRC main.cpp)
add_executable (${PROJECT_NAME} ${SRC}) 
target_include_directories(${PROJECT_NAME} PRIVATE inc)
1
И тут вот те нате
322 / 209 / 117
Регистрация: 12.07.2016
Сообщений: 555
15.02.2023, 00:43  [ТС]
zayats80888, ну, думал CB "все умеет", надо только настроить... как Qt В общем буду через него видимо сборку с CMake настраивать. Хотел именно автоматизировать процесс CMake из среды разработки. Руками я это и так научился делать, пока с CB разбирался

Добавлено через 2 минуты
Цитата Сообщение от zayats80888 Посмотреть сообщение
Однако CMake умеет генерировать файлы проекта для CB. Нужно только указать -G "CodeBlocks - MinGW Makefiles", например.
Это я смотрел, но не то, что нужно. При сборке/запуске CB все равно будет работать со своей копией .exe файла, не с CMake-овской.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
15.02.2023, 00:58
Цитата Сообщение от Evgen173 Посмотреть сообщение
В общем буду через него видимо сборку с CMake настраивать. Хотел именно автоматизировать процесс CMake из среды разработки.
А может не надо? Если вам скучно, можете и MSBuild к CB прикручивать.

Цитата Сообщение от Evgen173 Посмотреть сообщение
Это я смотрел, но не то, что нужно.
Сотря для чего. Для ваших "хождений по граблям" может и не то...

Цитата Сообщение от Evgen173 Посмотреть сообщение
При сборке/запуске CB все равно будет работать со своей копией .exe файла, не с CMake-овской.
Не должно быть никаких копий. Просто вы в пребилд скрипт зачем-то воткнули команду сборки:
Цитата Сообщение от Evgen173 Посмотреть сообщение
make -C build
0
И тут вот те нате
322 / 209 / 117
Регистрация: 12.07.2016
Сообщений: 555
15.02.2023, 17:35  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
Не должно быть никаких копий. Просто вы в пребилд скрипт зачем-то воткнули команду сборки
Я с вами согласен, что копий быть не должно. Проблема в том, что в CB заложены свои команды компиляции и сборки:
Code
1
2
g++.exe -Wall -g -std=c++17  -c C:\Projects\C_Projects\testCmake1\main.cpp -o obj\Debug\main.o
g++.exe  -o bin\test.exe obj\Debug\main.o
И для интеграции с CMake очевидно, что нужно изменить этот сценарий. Мне нужен вызов CMake, сборка make и запуск выходного .exe Но я не могу найти в настройках CB, где этот сценарий настраивается. Если в свойствах проекта выставить кастомный Makefile, то CB уже другие команды выдает: mingw32-make.exe -q -f Makefile Debug ... Понятно, что он берет это не с потолка и где-то это должно настраиваться, но вот где...
Вопрос можно переформулировать. Я вижу, где в CB настраиваются pre/post-build steps, но где настраивается сам процесс сборки?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
15.02.2023, 18:45
Лучший ответ Сообщение было отмечено Evgen173 как решение

Решение

Цитата Сообщение от Evgen173 Посмотреть сообщение
Вопрос можно переформулировать. Я вижу, где в CB настраиваются pre/post-build steps, но где настраивается сам процесс сборки?
Я еще раз повторю, что там нет интеграции с CMake, и, если бы это легко было сделать, то уже сделали бы (энтузиасты или разработчики).
У меня нет его под рукой, но насколько я помню, все настройки и команды(в том числе и команды pre-build) хранятся в файле проекта .cbp. Именно он является прослойкой между gui и make. Сборка же выполняется системой make(CB должен генерировать мэйкфайлы). Заставить CB генерировать .cmake файл взависимости от ваших настроек в интерфейсе вы можете только изменив исходный код.

Если вам нужна интеграция CMake, то выберите другую IDE.
2
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
15.02.2023, 19:53
Лучший ответ Сообщение было отмечено Evgen173 как решение

Решение

Цитата Сообщение от Evgen173 Посмотреть сообщение
Это я смотрел, но не то, что нужно. При сборке/запуске CB все равно будет работать со своей копией .exe файла, не с CMake-овской.
Загадочная какая-то причина отказа.

Еще раз, почему генерация cbp-файла не подходит?

Цитата Сообщение от Evgen173 Посмотреть сообщение
Проблема в том, что в CB заложены свои команды компиляции и сборки:
И, простите, что?
Сборка с помощью make (makefile для которого сгенерировал cmake) и сборка с помомщью codeblocks (проект для которого сгенернировал cmake) ничем не будут отличаться, т.к. источник у вас один - cmake-скрипт. Так в чем проблема??
1
И тут вот те нате
322 / 209 / 117
Регистрация: 12.07.2016
Сообщений: 555
15.02.2023, 20:24  [ТС]
DrOffset, я могу сгенерировать .cbp файл командой cmake -S . -B build -G "CodeBlocks - MinGW Makefiles" Что она сделает? Считает структуру проекта из CMakeLists.txt, соберет файлы с кодом и создаст на основе этого файл проекта для CB. Я открываю проект, вношу изменения и хочу пересобрать его из CB. Будет ли в таком случае вызываться cmake?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
15.02.2023, 20:39
Цитата Сообщение от Evgen173 Посмотреть сообщение
Я открываю проект, вношу изменения и хочу пересобрать его из CB. Будет ли в таком случае вызываться cmake?
Если изменения вносятся в CMakeLists.txt (и другие файлы проекта), то да. Если вы через GUI интерфейс что-то прикрутите, то эти изменения в CMakeLists.txt не сохранятся.
1
И тут вот те нате
322 / 209 / 117
Регистрация: 12.07.2016
Сообщений: 555
15.02.2023, 20:44  [ТС]
zayats80888, понял, буду разбираться. Всем огромное спасибо за подсказки!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.02.2023, 20:44
Помогаю со студенческими работами здесь

Code::Blocks
В Code::Blocks когда ты откомпилил программу в Debug, после внес изменения и снова &quot;откомпилил&quot;, то нет результата от 2-й компиляции -...

code::blocks 10.05
Я установил себе C++ code::blocks. И когда я компилирую любую программу и потом запускаю .exe выдаёт ошибку не находит libstdc++-6.dll. Я...

Code:Blocks
hiall, нужно чтоб проект на С компилировался как СРР, и как создать новый на СРР. респект и уважуха :mda:

Code::blocks и VS
всем привет, у меня такой вопрос: какой в Code::blocks аналог для #include stdafx.h? Нужно запустить, операции использую для этой...

Отладка в Code Blocks
Здравствуйте, кто-то может подсказать как пользоваться отладчиком в Code Blocks? Может быть есть какое-то видео на ютубе? Посвежее 2013...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru