Куда кидать файл cpp
В данной статье я хочу рассказать о том, как происходит компиляция программ, написанных на языке C++, и описать каждый этап компиляции. Я не преследую цель рассказать обо всем подробно в деталях, а только дать общее видение. Также данная статья — это необходимое введение перед следующей статьей про статические и динамические библиотеки, так как процесс компиляции крайне важен для понимания перед дальнейшим повествованием о библиотеках.
Все действия будут производиться на Ubuntu версии 16.04.
Используя компилятор g++ версии:
1 ответ 1
Хотя мой ответ немного не по теме, но решил поделиться опытом на всякий случай, для дополнительных знаний, опытом компиляции из командной строки.
Очень мелкие тестовые программки состоящие из 1-3 файлов, например олимпиадные задачки или задачки StackOverflow, можно компилировать быстрее и удобнее из командной строки, для этого один раз создаём такой командный файл compile.cmd :
В этом командном файле я указал стандартный путь куда устанавливается Visual Studio 2019 Community, у вас возможно будет другой путь к вашей студии, и файлу vcvars64.bat внутри подпапок, так что это требует правки.
Дальше, как видно я указал vcvars64.bat - это для компиляции 64-битного приложения, если надо 32-битное то просто меняем на слово vcvars32.bat .
Также командный файл рассчитан на компиляцию отладочной (debug) версии, если нужно релиз (release) версия то просто меняем в командном файле /D_DEBUG /Od /MTd на /GL /O2 /MT , и если в релизе не нужна отладочная информация то ещё убираем флаг /Z7 .
Далее используется этот командный файл элементарно, например для приложения с двумя исходными .cpp файлами будем просто вызывать:
Указывать заголовочные файлы ( .h / .hpp ) в команде компиляции не обязательно, достаточно только .c / .cpp файлов. После вызова команды компиляции на выходе будет .exe файл.
Частенько нет необходимости запускать тяжеловесную IDE Visual Studio для компиляции небольших приложений, проведения каких-либо тестов кода, не требующего полномасштабной отладки. В подобных случаях можно оперативно собрать приложение в консольном режиме, используя возможности предоставляемые компилятором от Microsoft (cl.exe) и запускными модулями IDE (devenv.exe, msdev.exe). Далее приводится код файлов сценариев (cmd) интерпретатора командной строки Windows, который с небольшими изменениями каждый может настроить под себя, с учётом путей к Visual Studio в своей системе.
Компиляция cpp-файлов
- sVSPath — путь к основному каталогу Visual Studio т.е. к корневому каталогу, в котором содержатся все прочие подкаталоги для данной версии VS.
- gavIncPathMy — возможно для VS 11.0 потребуется задать свои пути к подключаемым заголовочным файлам.
2) в разделе «Пути к Boost» можно задать BOOST_ROOT — путь к коревому каталогу библиотеки Boost (если она у вас установлена).
3) в разделе «Настройка путей к подключаемым файлам» при необходимости можно задать пути к заголовочным файлам Qt, WinDDK.
4) в разделе «Настройка путей к библиотечным (.lib) файлам» задаются пути к файлам библиотек (в частности для WinDDK).
Реже может возникнуть необходимость настроить следующие параметры под конкретный проект:
iCompVer — версия используемого компилятора (6 — для VC6, 8 — VC8 (2005), 9 — VC9, 10 — VC10 (2010), 11 — VC11 (2012).
gavLibFilesQtShared — имена .lib-файлов для динамически подключаемой библиотеки Qt;
gavLibFilesQtStatic — имена .lib-файлов для статически линкуемой библиотеки Qt.
gavLibFilesCrt — имена .lib-файлов для стандартных динамических библиотек, используемых в Windows.
iModeQt — режим линковки библиотеки Qt.
gavCompMode — флаги режима компиляции (однопоточные, многопоточные и т.п.).
gavOptimize — флаги оптимизации кода компилятором.
Чаще всего приходится менять параметры:
gavSrc — имена файлов с исходным кодом, разделённые пробелом (если их несколько).
bLibQt — флаг (0/1) необходимости использовать библиотеку Qt при сборке приложения.
bLibCrt — флаг (0/1) необходимости использовать стандартные CRT-библиотеки Windows при сборке приложения.
bLibBoost — флаг (0/1) необходимости использовать библиотеку Boost при сборке приложения.
gavSubsystem — подсистема создаваемого приложения: CONSOLE — консольное, WINDOWS — с графическим интерфейсом.
4) Компоновка
Компоновщик (линкер) связывает все объектные файлы и статические библиотеки в единый исполняемый файл, который мы и сможем запустить в дальнейшем. Для того, чтобы понять как происходит связка, следует рассказать о таблице символов.
Таблица символов — это структура данных, создаваемая самим компилятором и хранящаяся в самих объектных файлах. Таблица символов хранит имена переменных, функций, классов, объектов и т.д., где каждому идентификатору (символу) соотносится его тип, область видимости. Также таблица символов хранит адреса ссылок на данные и процедуры в других объектных файлах.
Именно с помощью таблицы символов и хранящихся в них ссылок линкер будет способен в дальнейшем построить связи между данными среди множества других объектных файлов и создать единый исполняемый файл из них.
Получим исполняемый файл driver:
5) Загрузка
Последний этап, который предстоит пройти нашей программе — вызвать загрузчик для загрузки нашей программы в память. На данной стадии также возможна подгрузка динамических библиотек.
Запустим нашу программу:
Состав компилятора g++
Мы не будем вызывать данные компоненты напрямую, так как для того, чтобы работать с C++ кодом, требуются дополнительные библиотеки, позволив все необходимые подгрузки делать основному компоненту компилятора — g++.
2) Компиляция
На данном шаге g++ выполняет свою главную задачу — компилирует, то есть преобразует полученный на прошлом шаге код без директив в ассемблерный код. Это промежуточный шаг между высокоуровневым языком и машинным (бинарным) кодом.
Ассемблерный код — это доступное для понимания человеком представление машинного кода.
Используя флаг -S, который сообщает компилятору остановиться после стадии компиляции, получим ассемблерный код в выходном файле driver.s:
Мы можем все также посмотреть и прочесть полученный результат. Но для того, чтобы машина поняла наш код, требуется преобразовать его в машинный код, который мы и получим на следующем шаге.
3) Ассемблирование
Так как x86 процессоры исполняют команды на бинарном коде, необходимо перевести ассемблерный код в машинный с помощью ассемблера.
Ассемблер преобразовывает ассемблерный код в машинный код, сохраняя его в объектном файле.
Объектный файл — это созданный ассемблером промежуточный файл, хранящий кусок машинного кода. Этот кусок машинного кода, который еще не был связан вместе с другими кусками машинного кода в конечную выполняемую программу, называется объектным кодом.
Далее возможно сохранение данного объектного кода в статические библиотеки для того, чтобы не компилировать данный код снова.
Получим машинный код с помощью ассемблера (as) в выходной объектный файл driver.o:
Но на данном шаге еще ничего не закончено, ведь объектных файлов может быть много и нужно их всех соединить в единый исполняемый файл с помощью компоновщика (линкера). Поэтому мы переходим к следующей стадии.
Заключение
В данной статье были рассмотрены основы процесса компиляции, понимание которых будет довольно полезно каждому начинающему программисту. В скором времени будет опубликована вторая статья про статические и динамические библиотеки.
----------------------------------------------------
ВАЖНО : Скачанные файлы миссии должны иметь расширение .pbo, иначе файлы миссии с именем папки острова считаются исходным кодом.
----------------------------------------------------
Установка миссии с расширением файла .pbo:
1)Открываем главную директорию самой игры
Частенько у всех она по адресу: C:Program Files (x86)SteamSteamAppscommonArma 3
2) Открываем папку с названием Missions и скидываем наши файлы с расширением .pbo.
3) Запускаем игру и нажимаем на кнопку Play -> Scenarios.
4) Выбираем из списка нужную и запускаем.
Бывает что мы имеем исходный код миссии который мы скачали чтобы редактировать на свой вкус.
1) Для этого нам нужно зайти в папку с названием Мои Документы или Документы (зависит от вашей Операционной системы).
2) Если вы меняли имя своего профиля в Арме 3, то у вас будет две папки с такими названиями как ArmA 3 Alpha и ArmA 3 Alpha - Other Profiles. Заходим в ту папку которую вы найдете свой используемый на данный момент профиль.
3) Далее если у вас нет папки под названием missions, то создаем и заходим в нее.
4) Скидываем ту папку, которая содержит точку и название острова после имени.
5) Запускаем игру и нажимаем на кнопку Editor, выбираем нужный остров для того чтобы зайти во встроенный редактор.
6) Во встроенном редакторе нажимаем на кнопку Load, чтобы загрузить исходник.
7) Далее редактируете на свое усмотрение, либо сразу запускаете нажав на кнопку Preview.
Помимо файлов с исходным кодом (в языке C++ они имеют расширение cpp , а в языке C — расширение c ) в проекте могут быть заголовочные файлы (в языке C++ они имеют расширение hpp или h ). В заголовочных файлах указываются прототипы функций и различные объявления.
Для создания заголовочного файла в окне Проекты щелкаем правой кнопкой мыши на названии проекта и из контекстного меню выбираем пункт Добавить новый. В открывшемся окне (рис. 2.7) из списка слева выбираем пункт C/C++, а из списка справа — пункт Заголовочный файл C/C++. Нажимаем кнопку Выбрать. На следующем шаге (рис. 2.8) вводим название HelloWorld.hpp в поле Имя файла. В поле Путь указываем значение C:\cpp\projectsQt\HelloWorld . Нажимаем кнопку Далее. На следующем шаге (рис. 2.9) нажимаем кнопку Завершить.
Рис. 2.7. Создание заголовочного файла. Шаг 1
Рис. 2.8. Создание заголовочного файла. Шаг 2
Рис. 2.9. Создание заголовочного файла. Шаг 3
Созданный файл отобразится на вкладке Проекты и будет открыт на отдельной вкладке для редактирования. Причем внутри файла будет вставлен код, приведенный в листинге 2.2. В файл HelloWorld.pro будут добавлены следующие строки:
Листинг 2.2. Содержимое файла HelloWorld.hpp
или внутри кавычек:
В первом случае заголовочный файл ищется в путях поиска заголовочных файлов. При этом текущий рабочий каталог не просматривается. Добавить каталог в пути поиска заголовочных файлов позволяет флаг -I в команде компиляции. Обычно с помощью угловых скобок включаются заголовочные файлы стандартной библиотеки или библиотеки стороннего разработчика.
Во втором случае мы имеем дело с заголовочным файлом, который вначале ищется в текущем рабочем каталоге (или относительно него), а затем в путях поиска заголовочных файлов, как будто название указано внутри угловых скобок. Таким способом обычно включаются заголовочные файлы проекта.
Внимательный читатель наверняка обратил внимание на то, что файл iostream не содержит расширение. Наличие расширения файла принято в стандартной библиотеке языка C. В стандартной библиотеке языка C++ расширение файла принято не указывать. Так как язык C++ наследует все библиотеки языка C, то файлы можно подключать как в стиле языка C, так и в стиле языка C++. Например, файл string.h из стандартной библиотеки языка C доступен в языке C++ под названием cstring , а файл math.h под названием cmath . Отличие между этими способами подключения заключается в импорте идентификаторов. В языке C при подключении файла (например, math.h ) все идентификаторы импортируются в глобальное пространство имен, а в языке C++ при подключении файла (например, cmath ) идентификаторы добавляются в пространство имен под названием std . Поэтому перед идентификатором необходимо указать название пространства имен (например, std::cout ). Использование пространств имен позволяет избежать конфликта имен в программе.
Можно указать просто название заголовочного файла:
абсолютный путь к нему:
или относительный путь к нему:
Если указано только название заголовочного файла и этот файл не входит с состав проекта (или название указано внутри угловых скобок), то нужно дополнительно указать место поиска заголовочных файлов. Путь к заголовочным файлам в командной строке добавляется с помощью флага -I :
В нашем случае путь содержит пробел, поэтому весь путь указывается внутри кавычек. Если пробелов нет, то кавычки можно не указывать.
Учебник C++ (Qt Creator и MinGW) в формате PDF
Помощь сайту
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов
До этого писал программу в 1 листинге с расширением .cpp, начал читать книгу. Там отдельно создается файл с расширением .h как понял заголовочный с названием всех классов и их членами. Затем создается файл с расширением .cpp в нем расписываются все методы и тд. И создается 3 файл, который уже компилируются с использованием файлов 1 и 2. Как их компилировать все вместе в Visual Studio, а не писать все в одной большой программе?
В Visual Studio если вы создаете пустой проект, то справа должны быть папки. Кликая пкм по папке "Исходные файлы" вы можете создать .cpp файл, а в папку "Файлы заголовков" .h файлы. И просто f5 жмете и у вас все автоматически будет собираться и компилироваться
имхо, использование солюшенов visual studio - плохой тон. Для проекта придется иметь visual studio , а она в добак только под винду. Что делать если ваш коллега программирует в другой ide? Все уважающие себя проекты имеют make и/или cmake скрипты для сборки (последний стал фактическим стандартом в сборке паректов)
@gbg А этот MSBuild под MacOS/Linux он какой компилятор использует? Можно например ему сказать использовать CLang или GCC? Получается все настройки проекта MSBuild сконвертирует в соответствующие аргументы командной строки других компиляторов clang/gcc?
Зачем нужно компилировать исходные файлы?
Исходный C++ файл — это всего лишь код, но его невозможно запустить как программу или использовать как библиотеку. Поэтому каждый исходный файл требуется скомпилировать в исполняемый файл, динамическую или статическую библиотеки (данные библиотеки будут рассмотрены в следующей статье).
1) Препроцессинг
Самая первая стадия компиляции программы.
Получим препроцессированный код в выходной файл driver.ii (прошедшие через стадию препроцессинга C++ файлы имеют расширение .ii), используя флаг -E, который сообщает компилятору, что компилировать (об этом далее) файл не нужно, а только провести его препроцессинг:
Взглянув на тело функции main в новом сгенерированном файле, можно заметить, что макрос RETURN был заменен:
В новом сгенерированном файле также можно увидеть огромное количество новых строк, это различные библиотеки и хэдер iostream.
Состав компилятора g++
Мы не будем вызывать данные компоненты напрямую, так как для того, чтобы работать с C++ кодом, требуются дополнительные библиотеки, позволив все необходимые подгрузки делать основному компоненту компилятора — g++.
Этапы компиляции:
Перед тем, как приступать, давайте создадим исходный .cpp файл, с которым и будем работать в дальнейшем.
driver.cpp:
Читайте также: