C/C++
Как устроены большие проекты?
Уже около 3 месяцев изучаю C++. Всё это время писал консольные программы которые из одного файла состоят. Но когда смотришь что-нибудь на гитхабе там практически любой проект состоит из десятков папок и сотен файлов. У меня возник вопрос как все эти файлы связываются друг с другом? Можете объяснить как устроены многофайловые проекты? Ну или дать ссылку на гайды или литературу по теме.
На уровне исходного кода файлы связываются через заголовки (.h). Таким образом им видны функции, переменные и классы, определённые в других файлах. Изучи разницу между объявлением (declaration) и определением (definition) в C++.
Каждый файл исходников компилируется в отдельный объектный модуль (.o в *nix, .obj в микрософте).
После этого запускается линкер и связывает их в исполняемый файл или разделяемую библиотеку (.so в *nix, .dll в микрософте).
Поскольку компиляция каждого файла исходников в C и C++ включает просмотр препроцессором десятков тысяч строк файлов заголовков, она является долгим процессом. Поэтому используются утилиты для сборки, отслеживающие изменившиеся файлы и их зависимости, например, make (древняя штука), gradle и т.п. При обычной сборке перекомпилируются только изменившиеся файлы и те, которые от них зависят. Также можно запустить очистку и полную пересборку проекта. Конфигурация проекта - какие файлы собирать, кто от каких заголовков зависит, - задаётся в отдельном файле проекта.
Кроме того, Микрософт поддерживает такую вещь, как прекомпиляция заголовков. Все внешние по отношению к проекту заголовки включаются в отдельный заголовок проекта, и исходники проекта подключают только его. Этот файл прекомпилируется и дальше только используется, что ускоряет компиляцию. Только если изменился состав внешних заголовков (что бывает редко), этот файл нужно пересобрать.
Каждый файл исходников компилируется в отдельный объектный модуль (.o в *nix, .obj в микрософте).
После этого запускается линкер и связывает их в исполняемый файл или разделяемую библиотеку (.so в *nix, .dll в микрософте).
Поскольку компиляция каждого файла исходников в C и C++ включает просмотр препроцессором десятков тысяч строк файлов заголовков, она является долгим процессом. Поэтому используются утилиты для сборки, отслеживающие изменившиеся файлы и их зависимости, например, make (древняя штука), gradle и т.п. При обычной сборке перекомпилируются только изменившиеся файлы и те, которые от них зависят. Также можно запустить очистку и полную пересборку проекта. Конфигурация проекта - какие файлы собирать, кто от каких заголовков зависит, - задаётся в отдельном файле проекта.
Кроме того, Микрософт поддерживает такую вещь, как прекомпиляция заголовков. Все внешние по отношению к проекту заголовки включаются в отдельный заголовок проекта, и исходники проекта подключают только его. Этот файл прекомпилируется и дальше только используется, что ускоряет компиляцию. Только если изменился состав внешних заголовков (что бывает редко), этот файл нужно пересобрать.
Модульность, унификация имен (префиксов, расширений), унификация директорий (src/ lib/), унификация правил инклудинга локальных и сторонних файлов, использование систем сборки (cmake, meson). А вообще никаких единых правил нет, сплошной бардак)
Начни изучение с... #include
))
Ведь это и есть самый простой способ связывать файлы в C++)))
Далее CMake
Если ты на линуксе, то CMake более чем норм
CMake не только h файлы, она и cpp файлы связывает, и вообще это система сборки такая, там и параметры для компилятора можно настроить и пакеты зависимостей даже она умеет искать сама и так далее
))
Ведь это и есть самый простой способ связывать файлы в C++)))
Далее CMake
Если ты на линуксе, то CMake более чем норм
CMake не только h файлы, она и cpp файлы связывает, и вообще это система сборки такая, там и параметры для компилятора можно настроить и пакеты зависимостей даже она умеет искать сама и так далее
Все зависит от того, чем вы пользуетесь:
1 - Linux: Используется g++ или gcc, где в качестве параметров используются имена .cpp, например g++ main.cpp printhello.cpp -o main (Названия проектов случайные, а параметр -o отвечает за создание исполняющего файла, типо как exe у windows)
2 - Visual Studio: тут проще, но надо смотреть. В обозревателе решений расположен ваш основной проект, где есть папки. В любую из этих папок кидаем наши .cpp файлы и все. (Я плохо объясняю, так что можете поискать в гугле по запросу многофайловые проекты)
Связь:
Связь может осуществляться через файлы .h (Заголовочный файл), но главное наличие cpp.
Приношу прощения, что так поверхностно объяснил, но надеюсь вам это немного да помогло разобраться.
1 - Linux: Используется g++ или gcc, где в качестве параметров используются имена .cpp, например g++ main.cpp printhello.cpp -o main (Названия проектов случайные, а параметр -o отвечает за создание исполняющего файла, типо как exe у windows)
2 - Visual Studio: тут проще, но надо смотреть. В обозревателе решений расположен ваш основной проект, где есть папки. В любую из этих папок кидаем наши .cpp файлы и все. (Я плохо объясняю, так что можете поискать в гугле по запросу многофайловые проекты)
Связь:
Связь может осуществляться через файлы .h (Заголовочный файл), но главное наличие cpp.
Приношу прощения, что так поверхностно объяснил, но надеюсь вам это немного да помогло разобраться.
я знаю тока титьки
Похожие вопросы
- C++: На каких фреймворках, средах разработки C++ делаются большие проекты, по типу Photoshop, Unreal Engine, Steam?
- Какой простенький проект можно сделать чтобы прокачать навыки? [если что учу c++]
- C/C++ Как устроена память, выделенная для структуры с указателем *next?
- Почему в крупных проектах пытаются избежать использование try catch?
- C++ Школьный проект
- C++. Как найти 3 самых больших числа из ряда чисел введенных пользователем?
- Создание программы на вычисление большего количества положительных или отрицательных элементов в среде c++
- Ошибка с русскими символами в языке C++ программе xcode. Пропадает если указать большее количество элементов в строке.
- Как раньше программисты создавали большие проекты без нормальной IDE и отладчика?