Создаем Makefile для gcc в Visual Studio Code


4. в нашей папке создаем файл main.c и пишем там священный тетраграмматон:
#include int main(void)
5. попробуйте-ка это скомпилировать. Если вы уже скачали и добавили в path заветный gcc из MinGW — все должно сработать. Вбиваем в терминале VSC:
Вот то получится:

Сгенерировался файл a.exe , т.к. мы не задали выходного имени компилятору. Можно этот экзешник уже запустить при помощи команды:
Ну а можно из cmd. Кстати, удобно переключаться между разными терминалами прямо в VSC. Для этого сначала вводите cmd в терминал, а потом можно там запустить a вот так:
$ cmd Microsoft Windows [Version 10.0.19044.1706] (c) Microsoft Corporation. All rights reserved. D:\GitHub\C>a Hello, world!
Чтобы выйти из терминала вбивайте команду exit
6. Теперь давайте скомпилируем более грамотно:
gcc -o main.exe main.c
Запустить, как вы уже наверное поняли, можно с помощью:
7. Ну каждый раз вводить команду gcc и опции компилятора — лень. Поэтому программисты используют так называемые мейкфайл (Makefile). Создайте новый файл в проекте и назовите его… Makefile VSC сразу же предложит вам скачать плагин на эту тему. В Makefile пишем:
all: main.exe main.exe: main.o gcc -o main.exe main.o main.o: main.c gcc -c main.c clean: rm main.o main.exe
Эт нубский варианты мейкфайла, который просто генерит экзешник и все. Там можно туеву тучу полезных вещей указать. Заметьте, что в мейкфайлах важны отступы (как в Python).
8. Теперь, когда у вас есть makefile — компилировать программу можно просто с помощью команды make:

Удобно? Не то слово! Дальнейшие хитрости и лайфхаки еще напишу в своих заметках. Дерзайте! И напишите комментарий
p.s.
Кстати, сахарок на сегодня: очистить терминал в VSC: Ctrl + L
Запустить Makefile под Windows
Мне необходимо запустить makefile для сборки программы, написанной на С (ее текст представлен на скрине). Я совсем не разбираюсь в вопросах отладки, компиляции, программирования в целом, мне просто нужна итоговая программка для своих расчетов. Я пыталась запустить makefile, читая аналогичные темы на форумах. Скачивала и устанавливала Mingw32, msys, прописывала пути в PATH, но каждый раз у меня ошибки. Запуск через командную строку выдает ошибку «make не является внутренней или внешней командой», либо ошибки с разными кодами, которые мне также не удалось устранить. Если кто-то сможет дать мне относительно подробную инструкцию, откуда и что можно скачать, чтоб все заработало, буду очень благодарна. Система x64, винда 10. Upd: добавила скрин кода makefile, и программки, которые он должен собрать, как я понимаю.

Отслеживать
задан 10 фев 2020 в 22:24
1 3 3 бронзовых знака
1 — скрина я не вижу, 2 — код приложите в виде кода
10 фев 2020 в 23:01
Начнём с того, что Makefile — это инструкция для программы make. На вашем компе эта программа не установлена. О чём Вам недвусмысленно говорит система: «make не является внутренней или внешней командой». Вторая проблема в том, что «мне просто нужна итоговая программка» — для какой ОС Вы рассчитываете получит программу? Ведь Makefile — это (скорее всего) инструкция для создания Linux программы. И даже получив её, Вы сможете запустить эту программу только под Linux. Это действительно то, что Вы хотите? Подозреваю — нет.
11 фев 2020 в 2:15
Ну и — что делать. Если Ваша программа на С написана без особых «выкрутасов» и привязки к особенностям Linux, то (скорее всего)особых проблем не будет: надо просто установить на Вашем компе любой виндовозный компилятор и с его помощью выполнить сборку программы. Для простоты, можно поставить обычный GCC. Как это сделать, подробно описано тут: programforyou.ru/poleznoe/kak-ustanovit-gcc-dlya-windows
11 фев 2020 в 2:23
А что бы эксперты могли сказать Вам, как собрать эту программу под виндой, надо опубликовать исходный текст, но не самой программы, а Makefile. Откройте его в блокноте и откопипастите сюда.
11 фев 2020 в 2:25
Если программа чисто вычислительная, то есть достаточно высокая вероятность собрать ее и под windows. Раз у Вас не получилось с MSYS (мне этот вариант больше нравится), то попробуйте установить Cygwin. Это среда, почти полностью эмулирующая окружение Linux. У нее есть свой интерпретатор bash, есть пакетный менеджер (впрочем, у MSYS2 тоже это есть). После установки минимальной версии cygwin нужно установить этим пакетным менеджером все необходимые пакеты (вплоть до графической среды x11, если надо) и потом можно собирать Вашу программу. Запускать Вам ее, также, проще будет в этой среде.
Скачать Advanced Makefile Generator для Windows
Это приложение для Windows под названием Advanced Makefile Generator, последний выпуск которого можно загрузить как qt2cpp-0.0.1.zip. Его можно запустить онлайн в бесплатном хостинг-провайдере OnWorks для рабочих станций.
Загрузите и запустите онлайн это приложение под названием Advanced Makefile Generator с OnWorks бесплатно.
Следуйте этим инструкциям, чтобы запустить это приложение:
— 1. Загрузил это приложение на свой компьютер.
— 2. Введите в нашем файловом менеджере https://www.onworks.net/myfiles.php?username=XXXXX с желаемым именем пользователя.
— 3. Загрузите это приложение в такой файловый менеджер.
— 4. Запустите любой онлайн-эмулятор OS OnWorks с этого сайта, но лучше онлайн-эмулятор Windows.
— 5. В только что запущенной ОС Windows OnWorks перейдите в наш файловый менеджер https://www.onworks.net/myfiles.php?username=XXXXX с желаемым именем пользователя.
— 6. Скачайте приложение и установите его.
— 7. Загрузите Wine из репозиториев программного обеспечения вашего дистрибутива Linux. После установки вы можете дважды щелкнуть приложение, чтобы запустить его с помощью Wine. Вы также можете попробовать PlayOnLinux, необычный интерфейс поверх Wine, который поможет вам установить популярные программы и игры для Windows.
Wine — это способ запустить программное обеспечение Windows в Linux, но без Windows. Wine — это уровень совместимости с Windows с открытым исходным кодом, который может запускать программы Windows непосредственно на любом рабочем столе Linux. По сути, Wine пытается заново реализовать Windows с нуля, чтобы можно было запускать все эти Windows-приложения, фактически не нуждаясь в Windows.
Расширенный генератор Makefile
Как запустить makefile в windows
Система make + Makefiles используется для того, чтобы помочь с принятием решения, какие части большой программы следует перекомпилировать, а какие пока не нужно. Понятно почему — если тупо перекомпилировать все заново, то это может занять много времени (в больших проектах час или больше). В подавляющем большинстве случаев это используется для компиляции файлов кода на языках C или C++. Другие языки имеют собственные инструменты, которые делают примерно то же самое, что и make. Make может также использоваться и по завершению компиляции, когда требуется выполнить ряд инструкций в зависимости от того, какие файлы поменялись в процессе компиляции. В этом руководстве (перевод статьи [1]) основной акцент сделан на компиляции кода C/C++.
Ниже показан пример графа зависимостей, который можно построить с помощью make. Если зависимости любого файла поменялись, то этот файл должен быть перекомпилирован. Если же поменялся файл инструкций для make (обычно это файл Makefile), то нужно перекомпилировать все файлы проекта без исключения.

Рис. 1. Пример зависимостей основного модуля main.cpp от других файлов.
Среди популярных систем сборки кода C/C++ можно вспомнить SCons [7], CMake [8], Bazel и Ninja. Некоторые редакторы кода наподобие Microsoft Visual Studio имеют свои встроенные инструменты сборки. Для Java это Ant, Maven и Gradle. Другие языки, такие как Go, Rust и TypeScript снабжены своими инструментами сборки.
Интерпретируемые языки, такие как Python, Ruby и чистый Javascript не требуют аналогов файлов Makefile. Цель Makefile в том, чтобы компилировать только те файлы, которые нужно перекомпилировать, основываясь на отслеживании изменения файлов. Однако когда поменялся интерпретируемый файл, то нет необходимости его перекомпилировать. Когда программа работает, всегда используется самая свежая версия интерпретируемого файла.
Существуют различные реализации make, отличающиеся своим поведением, однако это руководство вероятно будет корректным независимо от того, какую версию make вы используете. Однако следует иметь в виду, что руководство написано для GNU Make, которое считается стандартной реализацией make на Unix-системах (различные версии Linux, FreeBSD и MacOS). Все примеры будут работать для версий make 3 и 4, которые почти эквивалентны и отличаются только некоторой эзотерикой.
Версию make можно проверить командой make -v:
$ make -v GNU Make 4.2.1 Built for x86_64-pc-linux-gnu Copyright (C) 1988-2016 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later < http://gnu.org/licenses/gpl.html>This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.
Чтобы запускать примеры из этого руководства, то вам понадобится окно терминала и установленный инструментарий, где присутствует make. Для тех, у кого есть Linux, это условие по умолчанию выполнено. Для пользователей Windows это не всегда, но не составит большого труда установить себе такую систему как avr-gcc, MinGW/MSYS [9] или WSL [10]. Для каждого примера скопируйте его содержимое в файл Makefile, поместите его в каталог, где содержится компилируемый код, и в этой директории запустите команду make.
Давайте запустим самый простой пример Makefile:
hello:→echo "Hello, World"
Важное замечание: здесь слово с двоеточием «hello:» это маркер так называемой цели компиляции (compile target). Следующая за ним строка обязательно должна начинаться с символа табуляции TAB (‘\t’, ASCII-код 0x09). В этом руководстве символы табуляции будут показаны стрелочками →. Если вместо табуляции будут пробелы, то make выведет сообщение об ошибке [2].
Если запустить этот простой пример, то получится следующее:
$ make echo "Hello, World" Hello, World
[Синтаксис Makefile]
Makefile работает по определенному набору правил. Главное правило выглядит следующим образом:
targets: prerequisites
→command
→command
→command
targets. Здесь targets обозначает целевые объекты (prerequisites), которые являются именами файлов, отделенными друг от друга пробелами. Вы наверное уже встречались с такими маркерами, как all, clean, flash. На каждый маркер targets обычно приходится 1 файл.
command. Набор команд command это последовательность шагов, которые используются для сборки целевых файлов, которые обозначил targets. Строка команды обязательно должна начинаться с символа табуляции, но не пробела.
prerequisites. Это также имена файлов, отделенные друг от друга пробелами. Эти файлы должны существовать до того, как запустится обработка команд targets. Это так называемые зависимости (dependencies).
Примечание: иногда маркер цели targets называют правилом, а зависимости prerequisites целями. Что вносит некоторую путаницу, особенно в русскоязычной документации.
Давайте разберем основу технологии make. Начнем с традиционного примера hello world:
hello: →echo "Hello, World" →echo "Эта строка напечатается, если файл hello не существует."
По этому примеру можно уже многое понять:
• У нас есть одна цель компиляции (target) hello.
• У этой цели 2 команды.
• У этой цели нет зависимостей (no prerequisites).
Пока файла hello нет, при каждом запуске make будут выполняться команды цели hello. Как только файл hello появится, никакие команды этой цели выполняться не будут.
Важно отметить, что о маркере hello говорят и как о цели компиляции (target), и как о файле. Причина в том, что они напрямую взаимосвязаны. Обычно, когда запускается target, т. е. когда её команды запускаются, эти команды создадут файл, у которого будет такое же имя, что и у target. В этом нашем последнем примере цель компиляции hello не создает файл hello.
Давайте создадим более традиционный файл Makefile — он будет компилировать один файл на языке C. Но перед этим создадим файл test.c со следующим содержимым:
int main() < return 0; >
Затем создадим файл Makefile. Он как всегда, носит имя Makefile, и содержит инструкции для make:
test: →cc test.c -o test
Примечание: подразумевается, что у вас установлен компилятор gcc, он необходим для успешного запуска команды cc test.c -o test.
Запустите теперь команду make. Поскольку для команды make мы не предоставили никакой цели компиляции в командной строке, то в Makefile будет выполняться первая встретившаяся цель компиляции. В нашем случае, это единственная цель (test). При первом запуске будет создан файл test. При втором запуске будет выведено сообщение make: ‘test’ is up to date. Это потому, что файл test уже существует.
$ make cc test.c -o test $ make make: 'test' is up to date.
Но здесь есть проблема: если мы изменим test.c и затем запустим make, то он не перекомпилируется. Это можно исправить путем добавления prerequisite:
test: test.c →cc test.c -o test
Когда мы теперь снова запустим make, то произойдет следующая последовательность шагов:
• В Makefile будет выбрана первая цель (test). Первая цель по правилам make является целью по умолчанию (default target).
• Будет обнаружена зависимость этой цели test.c.
• Утилита make решает, должна ли она запустить на выполнение цель test. Она запустит команды цели test, если файл test не существует, или если файл test.c более новый, чем файл test.
Этот последний шаг самый важный, и он представляет сущность make. На этом шаге make должна определить, был ли изменен файл зависимости test.c (prerequisite, указанный после двоеточия цели) с момента последней компиляции. Если это так, и файл test.c был изменен (в простейшем случае изменение обнаруживается путем сравнения времени и даты последнего изменения файлов test и test.c), то запуск make должен перекомпилировать файл. И наоборот, если файл test.c не менялся, то его не нужно перекомпилировать.
Использование метки времени файлов для определения наличия изменения зависимости — разумная эвристика, потому что метка времени файла обычно меняется на более свежую только если файл был изменен. Но важно понимать, это так может быть не всегда. Вы могли бы, например, изменить файл зависимости test.c, и потом поменять его метку времени на какую-нибудь старую. Если вы это сделаете, то make некорректно решит, что файл зависимости не поменялся, и проигнорирует его изменение.
Демонстрация зависимостей на примере из трех целей. Следующий пример Makefile будет запускать при первом запуске все три свои цели.
test: test.o →cc test.o -o test # запустится как третье действие
test.o: test.c →cc -c test.c -o test.o # запустится как второе действие
# Если файл test.c существует, то эта цель не выполнится. Но этот пример
# в демонстрационных целях сделан более универсальным: если файл test.c
# будет создан этой целью.
test.c:
→echo "int main() < return 0; >" > test.c # запустится как первое действие
Когда вы запустите make в терминале, то скомпилируется программа test следующей последовательностью шагов:
• Команда make выберет цель test, потому что она первая в Makefile, и это таким образом default target.
• Цель test требует test.o, поэтому make ищет цель test.o.
• Цель test.o требует test.c, поэтому make ищет цель test.c.
• У цели test.c зависимостей нет, поэтом просто запустится команда echo, которая создаст файл test.c.
• Затем запустится команда cc -c цели test.o, потому что все её зависимости (test.c) удовлетворены.
• Затем запустится верхняя команда cc цели test, потому что все её зависимости (test.o) удовлетворены.
• В результате будет скомпилирована программа test.
Если вы удалите файл test.c, то все три цели перезапустятся друг за другом. Если вы его отредактируете и сохраните (и измените метку времени этого файла так, что она станет более поздней, чем у test.o), то запустятся первые две цели test: и test.o: (и тем самым поменяются метки времени у файлов test и test.o на более свежие). Если вы поменяете метку времени у файла test.o (например командой touch test.o), то запустится заново только первая цель test. Если вы ничего не поменяете, то ни одна из целей не запустится. Попробуйте!
Следующий пример не делает ничего нового, но тем не менее является хорошим дополнительным примером. Он всегда будет запускать обе цели, потому что some_file зависит от other_file, которая никогда не создается.
some_file: other_file →echo "Эта команда запустится всегда, и запустится второй" →touch some_file
other_file: →echo "Эта команда запустится всегда, и запустится первой"
[make clean]
ель clean часто используется для удаления результатов работы других целей, но не следует думать, что это какое-то специальное слово для make. Создайте следующий Makefile, и запустите для него команды make и make clean. Команда make создаст файл some_file, а команда make clean удалит его.
some_file: →touch some_file
clean: →rm -f some_file
Обратите внимание здесь на две новые вещи:
• Цель clean здесь не первая (она не является целью по умолчанию), и у неё нет зависимостей. Это значит, что она не запустится, пока не будет явно указана в командной строке make clean.
• Имя цели clean не предназначено для имени файла. Если по какой-то причине вдруг появится файл с именем clean, то эта цель никогда не запустится, и это будет сосем не тем, что вы хотели бы получить. Далее мы рассмотрим .PHONY, что позволит решить эту проблему.
[Переменные Makefile]
Переменные могут быть только строками. Для них обычно используют присваивание := , но также работает и присваивание = , см. далее «Переменные Makefile, часть 2».
Пример использования переменных:
files := file1 file2
some_file: $(files)
→echo "Look at this variable: " $(files) →touch some_file
file1: