Makefile. Компиляция нескольких файлов с исходным кодом

แชร์
ฝัง
  • เผยแพร่เมื่อ 25 พ.ย. 2024

ความคิดเห็น • 86

  • @tripledistillation1755
    @tripledistillation1755  5 วันที่ผ่านมา

    Если есть желание поддержать канал: yoomoney.ru/fundraise/16KBTQF4G72.241120

  • @ukolove
    @ukolove หลายเดือนก่อน +2

    Блин, наконец-то! Знаешь, сколько я перелопатил, чтобы узнать, как грамотно по разным директориям разносить файлы? На удивление только у тебя нашёл толковое объяснение. Все статьи пишут одно и то же, но как будто бы в отрыве от реальности и только для учебных проектов. Спасибо огромное и +100500 в карму! =)

  • @АндрейИванов-й5т2ь
    @АндрейИванов-й5т2ь 2 ปีที่แล้ว +15

    Приятная подача материала с хорошей методической проработкой. Молодец!

  • @Notthetylor
    @Notthetylor ปีที่แล้ว +9

    Thanks a lot bro... U searched many things but only ur content was in high quality . Lucky me that I know Russian)))

  • @zoompartyru
    @zoompartyru 8 หลายเดือนก่อน +2

    Отличная подача материала. Спасибо !

  • @bg_black_dragon
    @bg_black_dragon ปีที่แล้ว +3

    Здравствуйте, огромный вам спасибо за ценный урок!

  • @73jdie8hH
    @73jdie8hH 9 วันที่ผ่านมา

    Спасибо добрый человек!

  • @Programscape
    @Programscape ปีที่แล้ว +8

    Господи, почему же я не нашёл это видео раньше, автору гигантское спасибо!!!

  • @juneority
    @juneority 2 หลายเดือนก่อน

    Как же круто ты всё разложил по полочкам!!!! Спасибо!!

  • @askat25
    @askat25 4 หลายเดือนก่อน +4

    Голос офигенный, тебе бы озвучивать какие нить жизненные происходящие событие в мире)))))))

  • @musa_seyd
    @musa_seyd 2 ปีที่แล้ว +6

    спасибо большое, спустя столько попыток разобраться, мне наконец-то стало понятно

  • @Ocak-ok1li
    @Ocak-ok1li 7 หลายเดือนก่อน

    Смотрю пока только первые 5 минут и уже хочу сказать респект автору без воды и всякой чуши, пока все по делу, и что самое главное понятно и доступно 👍

  • @usErs_403
    @usErs_403 4 หลายเดือนก่อน

    Спасибо за единственный нормальный туториал на ютюбе

  • @rakydze3408
    @rakydze3408 2 ปีที่แล้ว +4

    Всё доходчиво чтобы понимали такие как я =) Отлично. Спасибо.

  • @SRoach
    @SRoach ปีที่แล้ว +2

    Большое спасибо за видео. Весьма полезно и интересно!

  • @olegkhotin4077
    @olegkhotin4077 ปีที่แล้ว +1

    Божественный контент!

  • @ruslanakhmetzyanov5503
    @ruslanakhmetzyanov5503 9 หลายเดือนก่อน

    Лучшее видео, благодарю

  • @MrChelovek68
    @MrChelovek68 4 หลายเดือนก่อน

    Офигенно и понятно,спасибо, человече

  • @native-nature-video
    @native-nature-video ปีที่แล้ว

    Отличный туториал. Спасибо!!!

  • @Аташ-в7л
    @Аташ-в7л ปีที่แล้ว

    Спасибо! Очень хорошее объяснение!

  • @zhdanoff7723
    @zhdanoff7723 5 หลายเดือนก่อน

    очень классно и доходчиво, спасибо ))

  • @kamosevoyan4370
    @kamosevoyan4370 2 ปีที่แล้ว +1

    Спасибо большое приятель.

  • @IllidanZur
    @IllidanZur ปีที่แล้ว

    отличное видео большое спасибо

  • @Tokuru
    @Tokuru 23 วันที่ผ่านมา

    Nicely done!

  • @yodapunishes
    @yodapunishes ปีที่แล้ว

    Спасибо, супер объяснение

  • @alexanderurezchenko6446
    @alexanderurezchenko6446 3 หลายเดือนก่อน

    Круто!

  • @YevheniiSerdiukov
    @YevheniiSerdiukov 2 ปีที่แล้ว

    Спасибо большое дружище !

  • @eudziro
    @eudziro 11 หลายเดือนก่อน

    Круто! Спасибо, очень помогли! Кстати голос похож на shimoroshow

    • @TheLechers
      @TheLechers 4 หลายเดือนก่อน

      а я все думаю, что слишком знакомый голос)

  • @7dtd_ruplay306
    @7dtd_ruplay306 ปีที่แล้ว

    Отличное видео!

  • @алексейюрьевич-ш6е
    @алексейюрьевич-ш6е 2 หลายเดือนก่อน

    Вапщее агонь! :)

  • @АлександрРощупкин-в3с
    @АлександрРощупкин-в3с 2 ปีที่แล้ว

    Огромное спасибо то что нужно было!)

  • @НикитаСеребряков-е1в
    @НикитаСеребряков-е1в 2 ปีที่แล้ว

    Cпасибо!

  • @1111ilya
    @1111ilya 2 ปีที่แล้ว

    крутяк чел!

  • @yurapetrovski3927
    @yurapetrovski3927 ปีที่แล้ว

    супер, спасибо большое, а планируется ли видео про cmake или юнит тесты?

    • @tripledistillation1755
      @tripledistillation1755  ปีที่แล้ว +7

      Этого в планах нет. Была задача сформировать такой makefile, чтобы потом про него забыть и никогда не вспоминать, но чтобы при копировании в папку с новым проектом все .c файлы компилировались и собирались в исполняемый файл.
      Может эта тема и заинетесует, но многообразие утилит для сборки и тестирования пока что только огорчает, так как попытки собрать проект из исходников напоминют ситуацию, когда ты заказал табурет, и мастер уже забивает последний гвоздь и вдруг говорит: "для двух последних ударов нужен молоток Х". Отвечаешь: "у меня такого нет, но есть Y и он вполне способен решить эту задачу". А мастер в ответ выдергивает гвоздь, разламывает всю табуретку и уходит. Стоит тебе через время найти этот X, как мастер заявлает, что тот уже старый и нужен "X 5.0", и вообще, половина досок уже "deprecated"

  • @p.polunin
    @p.polunin 2 ปีที่แล้ว

    Спасибо

  • @nnkakoito4699
    @nnkakoito4699 2 ปีที่แล้ว +2

    А если у меня в src лежат несколько папок, и все файлы в этих папках надо скомпилировать, но так-же есть и файлы которые не в папках, как можно это сделать?

    • @tripledistillation1755
      @tripledistillation1755  2 ปีที่แล้ว +11

      TARGET = MyProject
      CC = gcc
      PREF_SRC = ./src/
      PREF_OBJ = ./obj/
      SRC = $(shell find . -name "*.c")
      OBJ = $(patsubst $(PREF_SRC)%.c, $(PREF_OBJ)%.o, $(SRC))
      $(TARGET) : $(OBJ)
      $(CC) $(OBJ) -o $(TARGET)
      $(PREF_OBJ)%.o : $(PREF_SRC)%.c
      mkdir -p $(dir $@)
      $(CC) -c $< -o $@
      clean :
      rm $(TARGET) $(OBJ)
      Разница в том, что в переменой SRC список всех файлов, оканчивающихся на ".c", в том числе и в подкатологах внутри src. Команда shell позволяет выполнить команду оболочки и получить результат в виде строки. Далее заменяем префикс "./src/" на "./obj/", а так же расширение ".c" на ".o" с помощью команды patsubst во всех найденных именах файлов исходников. Таким образом, структура папок внутри "./obj/" предполагается такой же, как и в "./src/", но компилятор не будет создавать недостающие папки автоматически по относительному пути файла в "./obj/". Чтобы решить эту проблему, в правило компиляции отдельного исходника добавлена команда mkdir -p $(dir $@). Здесь $@ - это имя файла-цели, то есть файла ".o". dir позволяет выделить из этого имени имя католога, а ключ -p блокирует ошибку, если католог уже существует.

  • @hwd1978
    @hwd1978 ปีที่แล้ว +1

    Ещё раз спасибо! А как решать проблему отслеживания изменений заголовочных файлов? И ещё вопрос: ведь в каталоге src исходник могут быть размещены по подкаталогам произвольной структуры. Как этот момент учесть?

    • @tripledistillation1755
      @tripledistillation1755  ปีที่แล้ว

      Пожалуйста. Про заголовочные файлы - приведите пример. А про подкаталоги уже был вопрос ранее, я на него ответил. Там есть пример

    • @andrewkruchini8614
      @andrewkruchini8614 ปีที่แล้ว

      @@tripledistillation1755 например, в Вашем примере не указаны зависимости от my_lib.h

    • @tripledistillation1755
      @tripledistillation1755  8 หลายเดือนก่อน

      Для компилятора обычно указывают место хранения дополнительных заголовочных файлов. Делается это опцией -I
      Но здесь это не требуется, поскольку заголовочный там же, где исходник. Поэтому, к стати, заголовочный указан не в угловых скобках, а в ковычках

  • @mirvin11
    @mirvin11 2 ปีที่แล้ว +2

    Не понимаю в чём глобальная разница от bash скриптов

  • @ГлебРостов
    @ГлебРостов 7 หลายเดือนก่อน

    Хороший гайд. Но не все вопросы решены. Что делать, если в проекте есть код на нескольких языках? А ещё проект состоит из десятка других проектов, и вообще не ясно, что где лежит. У кого-то cmake прикручен, у кого-то makefile, а некоторые вообще sln. И ещё некоторые любят писать #include , а кто-то просто пишет #include , кто-то #include "C:\васян\sdl. h" , и плевать они хотели на то, что это один файл. Кому-то так удобнее, кому-то так. А тебе все это читать и переписывать не надо, тебе бы только скомпилировать. Под виндой кто-то уже для всего этого цирка сделал sln, и это работает. А makefile нет. Конкретно в моём случае это ещё и статическая библиотека name.lib, которую надо бы пересобрать для линукса в name.a. Если будет настолько обширный гайд, то тема уже будет освещена полностью

    • @tripledistillation1755
      @tripledistillation1755  7 หลายเดือนก่อน +2

      Да, есть над чем подумать. Для заголовочных файлов можно добавить место поиска с помощью опции -I. Makefile очень часто бывает результатом работы скрипта "configure" в случае Linux. Поэтому имеет смысл этот скрипт разобрать. Ещё подкинули вопрос насчет изменения содержимого .h файлов - мол, нужно добавить зависимость. Тут гайд скорее ситуационный: мне нужно было решить конкретную задачу - вот решил до определенной степени и поделился)

  • @daniilgavr5811
    @daniilgavr5811 ปีที่แล้ว +1

    Кажется, стоило бы .h тоже добавить в зависимости

    • @tripledistillation1755
      @tripledistillation1755  ปีที่แล้ว

      Возможно. Но gcc компонует исполняемый файл из набора модулей (.o), поэтому они присутствуют в зависимостях. Получение файлов (.o) - это тоже набор целей Makefile-а, для достижения которых нужны соответствующие исходники (.c). А вот какие заголовочные файлы использовать для компиляции исходников, указано в самих исходниках

    • @daniilgavr5811
      @daniilgavr5811 ปีที่แล้ว +3

      @@tripledistillation1755 Да, но вот если в проекте поменять .h, но не менять ничего другого - модули не перекомпилируются

    • @Иван-о3ъ6ь
      @Иван-о3ъ6ь 21 วันที่ผ่านมา

      ​@@daniilgavr5811и не должно перекомпилироваться, т.к. вы не изменили реализации функций, т.е. осталось всё по-прежнему. А вот если изменить, например, сигнатуру какой-нибудь ф-ии в .h - это повлечёт изменение и в .c, тогда потребуется перекомпиляция.

  • @artemherich8203
    @artemherich8203 2 ปีที่แล้ว

    Браво

  • @МаксимЭмов
    @МаксимЭмов ปีที่แล้ว +2

    САЛАМАЛЕЙКУМ МИФИСТЫ

  • @10Dima01
    @10Dima01 2 ปีที่แล้ว +3

    Кажется, что после распределения файлов (.с и .о) по папкам необходимо слегка модифицировать clean цель.

    • @tripledistillation1755
      @tripledistillation1755  ปีที่แล้ว

      Предлагайте свой вариант, будет интересно

  • @Guerrero_Blanco
    @Guerrero_Blanco 6 หลายเดือนก่อน

    Оказывается Make не такой сложный, хотя это всё можно и в простом скрипте описать )

  • @userqh67vey6
    @userqh67vey6 ปีที่แล้ว

    Зачем городить огород с мейкфайлом, если можно зависимости прописать в include в исходниах => тогда чтобы собрать проект, нужно скомпилировать 1 файл c main(), а все остальные подтянутся автоматически?

    • @vitlevanskiy
      @vitlevanskiy ปีที่แล้ว

      Тогда огородом будет main(), из за каждого там изменения все инклюды компилируй по 100 раз. Может откомпилировать их и больше не трогать никогда?

    • @userqh67vey6
      @userqh67vey6 ปีที่แล้ว

      @@vitlevanskiy зависит от IDE. Visual studio сама умеет находить .c файлы по имени h файла в правильной папке и повторно не компилирует если нет изменений.

  • @Buterbrodsgribami
    @Buterbrodsgribami 2 ปีที่แล้ว +1

    Можно ли с вами связаться? Мне нужно кое что спросить.

    • @tripledistillation1755
      @tripledistillation1755  2 ปีที่แล้ว +1

      Можно. Если вопрос касается материала или чего-то смежного, то задавайте его здесь

  • @sergkornev2811
    @sergkornev2811 2 ปีที่แล้ว +21

    спасибо ничего не работает

    • @comachine
      @comachine 2 ปีที่แล้ว +8

      @You Tube если не получается забить гвоздь молотком, это еще не значит, что молоток плохой)))

  • @ValeryTeslenko
    @ValeryTeslenko 9 หลายเดือนก่อน

    А если используется header файл?

    • @tripledistillation1755
      @tripledistillation1755  9 หลายเดือนก่อน

      Приведите конкретный пример

    • @ValeryTeslenko
      @ValeryTeslenko 9 หลายเดือนก่อน

      @@tripledistillation1755 , прошу прощения. Например для создания библиотеки, мы используем .h, и если изменить этот хедер файл, то нужно будет пересобирать все .c файлы, зависимые от него. Спасибо за видео!

    • @tripledistillation1755
      @tripledistillation1755  9 หลายเดือนก่อน

      Верно. Спасибо за комментарий

  • @reklats7270
    @reklats7270 2 ปีที่แล้ว

    А если у меня один cpp и один h файл?

    • @tripledistillation1755
      @tripledistillation1755  ปีที่แล้ว

      Можно поместить их в "src", а в Makefile-е заменить все вхождения ".c" на ".cpp"

  • @ДмитрийСерков-б9х
    @ДмитрийСерков-б9х ปีที่แล้ว

    делайте, пожалуйста, крупнее: на телефоне не разглядеть

    • @tripledistillation1755
      @tripledistillation1755  8 หลายเดือนก่อน

      Тут видео в принципе не рассчитано на такой способ просмотра, но подумаю

  • @saidamir6538
    @saidamir6538 ปีที่แล้ว

    Вы из стс? На голос из галилео похож

  • @shluhogon_42
    @shluhogon_42 2 ปีที่แล้ว

    ох уж эти гайды, когда все лежит в одной папке

  • @MECHANISMUS
    @MECHANISMUS 2 ปีที่แล้ว

    $(PREF_OBJ)%.c: $(PREF_SRC)%.o тут уже лишнее. Переменные SRC и OBJ уже содержат префы. То есть $(OBJ): $(SRC). Для этого ж они и создавались.

    • @tripledistillation1755
      @tripledistillation1755  2 ปีที่แล้ว +1

      Если вместо " $(PREF_OBJ)%.o: $(PREF_SRC)%.c " использовать " $(OBJ): $(SRC) ", то Make может неправильно сопоставить имена исходников и объектных файлов. Таким образом, при компиляции main.c объектный код может быть отправлен в my_lib.obj, например.

    • @MECHANISMUS
      @MECHANISMUS 2 ปีที่แล้ว

      @@tripledistillation1755 я попытался подставить готовые списки. Мэйк безошибочно перебирает список зависимостей по порядку, но почему-то подставляет в каждой команде только первое значение из списка целей (адресовал через $^). При подстановке корня то же правило работает чётко. Видимо, только так.

    • @tripledistillation1755
      @tripledistillation1755  2 ปีที่แล้ว

      @@MECHANISMUS да, я столкнулся с такой же проблемой, пытаясь проверить предложенный Вами вариант. Спасибо за обратную связь и рассмотренный случай

    • @СергейСмелов-ф1р
      @СергейСмелов-ф1р ปีที่แล้ว

      @@MECHANISMUS у меня тоже самое, только верно перебирает список целей и в каждой команде подставляет первый аргумент из зависимостей. Как решить понятия не имею. Метод из видео выдает ошибку, что нет правила для сборки объектников, хотя указано все точно так же.

  • @McGewen
    @McGewen 2 ปีที่แล้ว +1

    ЛИЧНО РУКУ ПОЖАЛ БЫ!!!!!!!!!!!!!!!!!

  • @nRADRUS
    @nRADRUS ปีที่แล้ว

    Makefile в целом достаточно бесполезен. Всё равно многие тулзы не создают файлов для зависимостей, поэтому можно просто sh-скрипт писать, и компилировать просто всё заново. Для малых проектов в винде это windres, крупные проекты так вообще свои тулзы имеют, как тот же firefox.

    • @tripledistillation1755
      @tripledistillation1755  8 หลายเดือนก่อน +1

      А разработчики make-а в курсе?)

  • @daniilk4994
    @daniilk4994 ปีที่แล้ว

    А почему бы не написать баш скрипт? В чем разница? Зачем мне именно make?

    • @tripledistillation1755
      @tripledistillation1755  ปีที่แล้ว +1

      В том, что в make есть механизм
      " :
      "
      А это удобно в случае сборки проекта. Можно относительно просто выстроить дерево зависимостей. Такая задача наверняка решаема в bash, но, может быть, с большими усилиями. Но это то, как я себе представляю ситуацию. А вообще, make - это утилита, то есть средство, а не цель. Средства могут быть разными, зацикливаться на них не следует

    • @daniilk4994
      @daniilk4994 ปีที่แล้ว

      @@tripledistillation1755 да, досмотрел видос до конца, немного поюзал, удобнее, чем могло бы быть с башем)

  • @hwd1978
    @hwd1978 ปีที่แล้ว

    Круто! Спасибо!