Сборка проекта С++

preview_player
Показать описание
Эта тема всплывает неизбежно и неоднократно даже при работе над небольшими проектами. Но если держать в голове достаточно небольшую и структурированную схему, отлаживать некоторые моменты становится на порядок легче.

Этапы сборки - препроцессинг, компиляция, линковка. Схема сборки. Хедеры (заголовочные файлы .h), статические библиотеки (.lib/.a), динамические библиотеки (.dll/.so). Сборка в консоли, основные флаги g++. Порядок сборки, характерные ошибки и сценарии использования.
Рекомендации по теме
Комментарии
Автор

это то видео, которое не искал, но рад что нашёл

ГородскойПосёлок
Автор

Ты золото. Просто нет слов. Понятно как ясный день!

kurban
Автор

Основная задача линкера - подтягивать связи энтри поинта (обычно в C++ это void main()) с другими символами (в простейшем случае - читай "функциями") проекта (проект = набор исходных файлов, из которых будет собран конечный исполняемый файл).

Например: в 1.cpp (1.obj) мы задефайнили функцию, а в 2.cpp (2.obj) хранится ее тело. Собственно, линкер сопоставляет объявление и реализацию и создает уже единый исполняемый файл. Иногда это сопоставление может быть многоступенчатым (например в 2.cpp у нас стоит инклюд какой-нибудь стандартной библиотеки, которая не инклюдится непосредственно в 1.cpp), но сути это не меняет. По цепочке от объекта (.obj), где лежит точка входа(=энтри поинт=entry point) строятся зависимости ко всем используемым функциям и объектам и собираются в один конечный "монолит".

MrReape
Автор

#include не клеит ничего сверху. Он копипастит содержимое указанного файла в ту строку, где он сам находится, например:

[main.cpp]:
void function a(){
return;

#include "bracket.h"
a();

[bracket.h]:

}

не выдаст никаких ошибок компиляции и все прекрасно запустится после сборки. Вместо строки #include "bracket.h" просто подставится закрывающая фигурная скобка. В результате листинг кода будет следующий:
void function a(){
return;
}
a();

Отсюда же лезут ошибки связанные с множественными инклюдами одного и того же файла, для которых придумано #pragma once

MrReape
Автор

теперь ясно почему компилятор так долго билд делает, я бы так быстро с помощью ручки и бумажки не смог собрать! молодец, компилятор!

RisenMultiplayer
Автор

Вот поэтому надо пользоваться предкомилироваными заголовками и запихнуть туда общую часть всех инклудов чтобы каждый раз весь этот талмут не компилило.

kpanat
Автор

самое понятное видео об поэтапной сборке с++ проектов

sjiwul
Автор

Великолепный ролик!
Всё понятно и доходчиво

montroseaguilar
Автор

Ты умничка, не останавливайся писать уроки, отлично получается!

gentleWack
Автор

просто гениально, спасибо большое <3

alexeykravtsov
Автор

35:36 ну как бы не только в иде по разному, компиляторы тоже не все с одинаковыми "настройками". Обычно все базовое действительно одинаково, но кто знает чем придется кому компилировать и подо что.

fatoldhikki
Автор

Спасибо! наконец понял зачем существуют заголовочные файлы

АртемСверканов
Автор

Empress, ты ли это?))) 😇
Отличные ролики снимаешь.

micropp
Автор

Но надо иметь ввиду что все dll многопользовательские. И там надо добавлять блокировки для предотвращения коллизий. А статические это либа конкретной проги. Там никакие блокировки не нужны.Если конечно вы не запускает функции в многопоточном режиме. Тогда так же нужны...

kpanat
Автор

Хороший пример как сложно рассказать о простом

DARKFAVEN
Автор

Очень интересно получилось, спасибо. Если я правильно понял, то cp = copy, mv = move, rv = remove, а ls не понял. И еще, $ g++ -E - препроцессинг, $ g++ -c - объектный файл (.о), $ g++ -s - ассемблерный листинг, $ g++ 1.cpp - компиляция.

lovxxs
Автор

Там у компоновщика (линкер) присутствует ABI, чтобы склмпоновать) слинковать, должен быть бинарный интерфейс

ИльдарБулатов-тх
Автор

Скажите пожалуйста, как так получается, что например английское оверкил произносите нормально, но расширение файла цпп, хотя на английском это си пи пи. И так же не два аш, а хотя бы два ейч. Английское Е читается как и, а не е. Откуда такая каша?

realityiscoming
Автор

Можно посмотреть спрепроцессный файл(ой даже не знаю как правильно это произнести спрепроцессный или спрепроцессорный или спрепроцесированный? Гуглить надо...). Короче его лучше не смотреть тоже большой... Короче если больше 10 тыс строк то лучше не смотреть... неважно на чём...

kpanat
Автор

хмм я чот не понял про .text+0x21, разве +0х21 это не байтовое смещение относительно сегмента text, про какие строки речь ? XD

Nop_h
join shbcf.ru