Компиляции С Проглатыванием
Компиляции С Проглатыванием
Главная » C++ » Компиляция с g ++ - включая заголовочные файлы
У меня просто быстрый вопрос, поскольку я пытаюсь понять, как скомпилировать (в Ubuntu 12.04) основную часть в c ++, которая включает в себя простой заголовочный файл.
Работает отлично. Тем не менее, это сбивает меня с толку насчет заголовка файла. На данный момент у меня есть простая программа:
Где мой «add.cpp» просто складывает два числа вместе.
Является ли заголовочный файл просто заменой для прототипа функции? Нужно ли компилировать файл заголовка отдельно или достаточно включить все файлы .cpp в командную строку? Я понимаю, что если мне нужно больше файлов, будет необходим make-файл.
#include код препроцессора просто заменяет #include строка с содержимым соответствующего файла, который add.h в вашем коде. Вы можете увидеть код после предварительной обработки с аргументом g ++ -E ,
Вы можете поместить что-либо теоретически в заголовочный файл, и содержимое этого файла будет скопировано с #include заявление, без необходимости компиляции заголовочного файла отдельно.
Вы можете положить все cpp файл в одной команде, или вы можете скомпилировать их отдельно и в конце связать их:
Вы также можете написать прототипы функций непосредственно в файл cpp, например (без заголовочного файла):
Это тоже работает. Но использование заголовочных файлов является предпочтительным, поскольку прототипы могут использоваться в нескольких файлах cpp без необходимости изменения каждого файла cpp при изменении прототипа.
Процесс компиляции программ на C++ / Хабр
Компиляция с g ++ — включая заголовочные файлы
Исправление ошибок компиляции — процесс компиляции
Этапы компиляции
Компиляция – что это такое простыми словами
Toggle navigation
CppStudio
Отладка программ
Исправление ошибок компиляции — процесс компиляции
Исправление ошибок компиляции — процесс компиляции
Ошибки — это условия, которые препятствуют завершению компиляции ваших файлов.
line 13, unexpected parenthesis ‘)’
foo.cc:7: error: semicolon missing after struct declaration
Это руководящий принцип вычисления ошибок компилятора: если сомневаетесь, посмотрите в программе раньше. Так как синтаксические ошибки могут позже иметь серьезные последствия, вполне возможно, что компилятор указывал номер строки, в которой на самом деле не было синтаксической ошибки!
Это ваша первая программа на C (или C++) — она не такая уж большая, и вы собираетесь скомпилировать ее. Вы нажимаете на compile (или вводите команду компиляции) и ждете. Ваш компилятор выдает пятьдесят строк текста. Вы выбираете слова warning и error . Задумываетесь, значит ли это, что все в порядке. Вы ищите полученный исполняемый файл. Ничего. Черт возьми, думаете вы, я должен выяснить, что все это значит …
Во-первых, давайте различать типы ошибок. Большинство компиляторов покажет три типа предупреждений во время компиляции:
Хоть вы и не хотите игнорировать их, предупреждения компилятора не являются чем-то достаточно серьезным, чтобы не скомпилировать вашу программу. Прочитайте следующую статью, которая расскажет вам, почему стоит дружить с компилятором и его предупреждениями . Как правило, предупреждения компилятора — это признак того, что что-то может пойти не так во время выполнения. Как компилятор узнает об этом? Вы, должно быть делали типичные ошибки, о которых компилятор знает. Типичный пример — использование оператора присваивания = вместо оператора равенства == внутри выражения. Ваш компилятор также может предупредить вас об использовании переменных, которые не были инициализированы и других подобных ошибках. Как правило, вы можете установить уровень предупреждений вашего компилятора — я устанавливаю его на самый высокий уровень, так что предупреждения компилятора не превращаются в ошибки в выполняемой программе (“ошибки выполнения”).
Тем не менее, предупреждения компилятора не должны останавливать работу вашей программы (если только вы не укажете компилятору рассматривать предупреждения как ошибки), так что они, вероятно, не так серьезны как ошибки.
Ошибки компилятора ограничены отдельными файлами исходного кода и являются результатом “синтаксических ошибок”. На самом деле, это означает, что вы сделали что-то, что компилятор не может понять. Например, выражение for(;) синтаксически не правильно, потому что цикл всегда должен иметь три части. Хотя компилятор ожидал точку с запятой, он мог также ожидать условное выражение, поэтому сообщение об ошибке, которое вы получите может быть что-то вроде:
Заметьте, что ошибки компилятора всегда будут включать номер строки, в которой была обнаружена ошибка.
Даже если вы прошли процесс компиляции успешно, вы можете столкнуться с ошибками компоновщика. Ошибки компоновщика, в отличие от ошибок компилятора, не имеют ничего общего с неправильным синтаксисом. Вместо этого, ошибки компоновщика — это, как правило, проблемы с поиском определения функций, структур, классов или глобальных переменных, которые были объявлены, но не определены, в файле исходного кода. Как правило, эти ошибки будут иметь вид:
Как правило, процесс компиляции начинается с серии ошибок компиляции и предупреждений и, исправив их, вы столкнетесь с ошибками компоновщика. В свою очередь, я бы сначала исправлял ошибки компиляции, а затем ошибки компоновщика.
Если вы столкнулись с перечнем пятидесяти или шестидесяти ошибок и предупреждений, то будет сложно определить с чего начать. Самое лучшее место, тем не менее, в начале списка. В самом деле, вы почти никогда не начинаете исправлять ошибки от конца файла до его начала по одной простой причине: вы не знаете ошибки ли они на самом деле!
Одна ошибка в верхней части вашей программы может вызвать целый ряд других ошибок компилятора, потому что эти строки могут рассчитывать на что-то в начале программы, что компилятор не смог понять. Например, если вы объявляете переменную с неправильным синтаксисом, компилятор сообщит о синтаксических ошибках, и что он не может найти объявление для переменной. Точка с запятой, поставленные не в том месте, могут привести к огромному количеству ошибок. Это происходит, потому что синтаксис C и C++ синтаксис позволяет объявить тип сразу же после его определения:
код создаст переменную, MyStruct , с местом для хранения структуры, содержащей два целых числа. К сожалению, это означает, что если вы опустите точку с запятой, компилятор будет интерпретировать это так, как будто следующая вещь в программе будет структурой (или возвращает структуру).
может привести к огромному количеству ошибок, возможно, включая сообщения:
Все это из-за одного символа! Лучше всего начать с самого верха.
Большинство сообщений от компилятора будет состоять как минимум из четырех вещей:
Вывод g++ для указанной выше программы может выглядеть следующим образом (ваши результаты могут отличаться, если вы используете другой компилятор):
foo.cc это имя файла. 7 — номер строки, и ясно, что это ошибка. Короткое сообщение здесь весьма полезно, поскольку оно показывает именно то, что не правильно. Заметим, однако, что сообщение имеет смысл только в контексте программы. Оно не сообщает, в какой структуре не хватает запятой.
Более непонятным является другое сообщение об ошибке из той же попытки компиляции:
Программист должен выяснить, почему это произошло. Обратите внимание еще раз, что эта ошибка была вызвана проблемой в начале программы, не в строке 8, а раньше, когда в структуре не хватает точки с запятой. К счастью, понятно, что определение функции для foo было в порядке, это говорит нам о том, что ошибка должна быть где-то в другом месте программы. На самом деле, она должна быть в программе раньше — вы не будете получать сообщение об ошибке, которое указывает на синтаксическую ошибку до строки, на которой ошибка на самом деле произошла.
Будет гораздо хуже, если компилятор не будет сообщать вам, что произошло ранее в программе. Даже первая ошибка компилятора, которую вы получите, может быть связана с несколькими строками до указанного предупреждения.
Есть несколько особенно сложных типов ошибок компилятора. Первый — это необъявленная переменная, которую, как вам кажется, вы объявили. Часто, вы можете указать, где именно переменная была объявлена! Проблема в том, что часто переменная просто написана с ошибкой. К сожалению, это довольно трудно увидеть, так как обычно мы читаем то, что ожидаем, а не то, что есть на самом деле. Кроме того, есть и другие причины, почему это может быть проблемой — например, проблемы с видимостью!
Чтобы разобраться в возможных проблемах, я делаю так: в строке, где находится якобы необъявленная переменная, надо выполнить поиск текстовым редактором слова под курсором (в качестве альтернативы можно скопировать имя переменной и выполнить поиск), и если я записал его неправильно, оно не найдется. Также не надо вводить имя переменной вручную, так как вы случайно можете ввести его правильно.
Что происходит? Почему конец файла будет «неожиданным» ? Ну, здесь главное думать как компилятор; если конец файла является неожиданным, то он, должно быть, чего-то ждет. Что бы это могло быть? Ответ, как правило, «завершение». Например, закрывающие фигурные скобки или закрывающие кавычки. Хороший текстовый редактор, который выполняет подсветку синтаксиса и автоматический отступ, должен помочь исправить некоторые из этих ошибок, что позволяет легче обнаружить проблемы при написании кода.
В конечном счете, если сообщение непонятное, то подходите к проблеме, думая, как компилятор пытается интерпретировать файл. Это может быть трудно, когда вы только начинаете, но если вы обращаете внимание на сообщения и попробуете понять, что они могли бы означать, вы быстро привыкнете к общим закономерностям.
Наконец, если ничего не работает, вы всегда можете просто переписать несколько строк кода, чтобы убрать любые скрытые синтаксические ошибки, которые вы могли не увидеть. Это может быть опасно, так как вы можете переписать не ту секцию, но это может помочь.
После того как вы окончательно исправили все ошибки синтаксиса, вздремнули, перекусили пару раз и морально подготовили себя к правильной компиляции программы, вы все равно можете столкнуться с ошибками компоновщика. Их часто довольно сложно исправить, потому что они не обязательно являются результатом того, что написано в вашей программе. Я вкратце опишу типичные видов ошибок компоновщика, которые можно ожидать, и некоторые пути их решения.
У вас могут возникнуть проблемы с тем, как вы настроили свой компилятор. Например, даже если включить нужные заголовочные файлы для всех ваших функций, вы все равно должны предоставить вашему компоновщику правильный путь в библиотеку, которая имеет фактическую реализацию. В противном случае, вы получите сообщение об ошибке:
Обратите внимание на поддержку этих функций компилятором (это может произойти, если вы включите собственное объявление функции, чтобы обойти ошибку во время компиляции). Если ваш компилятор поддерживает эту функцию, то для решения проблемы обычно требуются конкретные настройки компилятора. Вам следует сообщить компилятору, где искать библиотеки и убедиться, что библиотеки были установлены правильно.
Ошибки компоновщика могут произойти в функциях, которые вы объявили и определили, если вы не включили все необходимые объектные файлы в процесс связывания. Например, если вы пишете определение класса в myClass.cpp , а ваша основная функция в myMain.cpp , компилятор создаст два объектных файла, myClass.o и myMain.o, а компоновщику будут нужны оба из них для завершения создания новой программы. Если оставить myClass.o , то у него не будет определения класса, даже если вы правильно включите myClass.h !
Иногда появляются незначительные ошибки, когда компоновщик сообщает о более чем одном определении для класса, функции или переменной. Эта проблема может появиться по нескольким причинам: во-первых, у объекта может быть два определения — например, две глобальные переменные объявлены как внешние переменные, чтобы быть доступными за пределами файла исходного кода. Это относится как к функциям, так и к переменным, и это, на самом деле, нередко случается. С другой стороны, иногда это проблема с директивами компоновщика; несколько раз я видел, как люди включают несколько копий одного и того же объектного файла в процесс связывания. И бинго, у вас есть несколько определений. Типичным проявлением этой проблемы является то, что у целого ряда функций есть несколько определений.
Последний странный тип ошибки компоновщика — сообщение
Данная ошибка компоновщика отличается от других тем, что она может не иметь ничего общего с объектом, включая файлы или правильные пути к вашей библиотеке. Напротив, это означает, что компоновщик пытался создать исполняемый файл и не смог понять, где расположена функция main() . Это может случиться, если вы забыли включить основную функцию, или, если вы попытаетесь скомпилировать код, который никогда не был отдельным исполняемым файлом (например, если вы попытались скомпилировать библиотеку).
Вы должны войти , чтобы оставить комментарий.
© 2020 CppStudio - Программирование для начинающих на С++
Порно Глотают См
Семейные Порно Фильмы Кончают Вовнутр
Внутрь Меня Вошел Его Толстый Член
Реальное Порно Целок
Порно Кино С Участием Карликов
![](http://mypresentation.ru/documents_5/5b2ded5024201fd278d993f995cbbedb/img38.jpg)
![](http://images.myshared.ru/4/292968/slide_5.jpg)
![](http://cf.ppt-online.org/files/slide/w/wEmxZka89BUNRfTCnbcGoSyO10KA6V57MzDHhl/slide-21.jpg)
![](http://images.myshared.ru/6/654378/slide_8.jpg)
![](http://myslide.ru/documents_3/585f71fb71b574b5a92b87e5f970fe9a/img56.jpg)
![](http://images.myshared.ru/24/1272362/slide_12.jpg)
![](http://present5.com/presentation/-76486278_347473213/image-3.jpg)
![](http://cf.ppt-online.org/files/slide/a/aFdVUQCjmuTOv7ebDIngpR0fB9lk15P6cs24L8/slide-22.jpg)
![](http://www.dummies.com/wp-content/uploads/453181.image0.jpg)
![](http://cf.ppt-online.org/files1/slide/i/iMl4D3gVzZjtNkISx8uQEd2v97J5mehRGoy6w0/slide-1.jpg)
![](http://cf.ppt-online.org/files/slide/a/aOfiLZ7NGAxgQYU5lt8SRmsu6bTJpC2rHen9kI/slide-18.jpg)
![](http://mypresentation.ru/documents_5/fc09be585335e6e936fe19d44ff72cf3/img17.jpg)
![](http://i.ytimg.com/vi/kCrANExKeIY/maxresdefault.jpg)
![](http://cf.ppt-online.org/files/slide/b/b9WJTdIR8j0MY7oHAnKmfVa2PxFgGuO61ECXQL/slide-13.jpg)
![](http://myslide.ru/documents_3/c3d145471444bcbc33b3787b077fabb7/img21.jpg)
![](http://slideplayer.com/slide/716731/2/images/14/Compilation+Process+Executable+code+a.exe+Source+code+file1.c.jpg)
![](http://cf.ppt-online.org/files/slide/3/3yMYD4V1cuBEkeJhlrUw2xFWKtgfpXSTNHLvdO/slide-3.jpg)
![](http://thepresentation.ru/img/thumbs/e374f02f38d75417ce1ffb07f6d47872-800x.jpg)
![](http://devnuances.com/wp-content/uploads/2013/11/Protsess-kompilyatsii.png)
![](http://cf.ppt-online.org/files/slide/s/S1JgNUIvn9GBZLQrTs05FHtdaA3i2Oeh6DX8jy/slide-8.jpg)
![](http://cf.ppt-online.org/files/slide/s/S1JgNUIvn9GBZLQrTs05FHtdaA3i2Oeh6DX8jy/slide-13.jpg)
![](http://thepresentation.ru/img/thumbs/deaf1031c023afc7c5708247c81c4971-800x.jpg)
![](http://cf.ppt-online.org/files/slide/s/S1JgNUIvn9GBZLQrTs05FHtdaA3i2Oeh6DX8jy/slide-17.jpg)
![](http://present5.com/presentation/18214294_54661326/image-4.jpg)
![](http://900igr.net/up/datas/194264/033.jpg)
![](http://myslide.ru/documents_3/04dd1156bcdbfb6bde772fe5ce1d0588/img8.jpg)
![](http://present5.com/presentation/9539590_131043973/image-9.jpg)
![](http://cf.ppt-online.org/files/slide/y/YJAMnH7fiIkwpByVq53PDL9SamdojrOERWTF1Z/slide-2.jpg)
![](http://cf.ppt-online.org/files/slide/h/h06ftsaOemTMGoSIkb4FqdNEWY1RvHUBunl32z/slide-4.jpg)
![](http://cf2.ppt-online.org/files2/slide/2/2PoZ1nXqugvFmwp8YdK5feLND6b7irHQOyGVhc/slide-7.jpg)
![](http://cf2.ppt-online.org/files2/slide/9/9VGWRv4Jjqg85sfzSBmZOYidFD0LMC6hwxl3Hn/slide-9.jpg)
![](http://img0.joyreactor.cc/pics/comment/Znoflats-%D0%9A%D0%BE%D0%BC%D0%B8%D0%BA%D1%81%D1%8B-1796008.gif)
![](http://www.kharkovforum.com/ims/2017/05/04/7ahega.gif)
![](http://cdn.trinixy.ru/uploads/posts/2019-09/1569848797_gifs_08.gif)
![](http://wiki.stepik.org/images/thumb/b/b0/Step_2_%28S-6962%29_1.png/800px-Step_2_%28S-6962%29_1.png)
![](http://hsto.org/getpro/habr/post_images/7bc/e6c/3b2/7bce6c3b238299f98b6c16e339aa5b10.png)
![](http://www.celebritongue.com/album/britney-spears/photo/britney-spears-77718ebe47601ff7.jpg)
![](http://i.ytimg.com/vi/ftmoWnJFVKM/hqdefault.jpg)
![](http://cdn.neow.in/forum/uploads/post-96564-1109132527_thumb.jpg)
![](http://uciheadandneck.com/wp-content/uploads/2019/08/Best-Head-and-Neck-Clinic-in-Orange-County-uci.ent_.com-2.jpg)
![](http://cf2.ppt-online.org/files2/slide/v/v1LjYlue4qSdwhJnNQZrazfAKW7BPG56boX302/slide-15.jpg)
![](http://cf.ppt-online.org/files/slide/s/S1JgNUIvn9GBZLQrTs05FHtdaA3i2Oeh6DX8jy/slide-9.jpg)
![](http://cf.ppt-online.org/files/slide/e/e07LOsIYZp5CShF4Mw/slide-14.jpg)
![](http://cf.ppt-online.org/files/slide/a/AJS7IKB6vrEqTdWYFRbfagwnuHcUoVXOhi4ykZ/slide-86.jpg)
![](http://present5.com/presentation/-101637156_417372228/image-4.jpg)
![](http://900igr.net/up/datas/239647/029.jpg)
![](http://cf2.ppt-online.org/files2/slide/c/CGAFral46iWqc0oLb5mVYKgkX1P2NjBMuEDzvspQe/slide-1.jpg)
![](http://i.imgur.com/JN6HokY.jpg)
![](http://www.spletnik.ru/img/2019/09/_elizaveta/20190919-lip9.gif)
![](http://i.pinimg.com/originals/f6/b3/3b/f6b33b0cd0dd8ba6d4ace535e4734624.gif)
![](http://server.179.ru/tasks/cpp/total/images/compilation.png)