|
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
|
||||||
Как правильно из одного cpp подключить другой06.10.2012, 00:02. Показов 15975. Ответов 34
Метки нет (Все метки)
Есть 2 .cpp файла: a.cpp и b.cpp. Когда пишу:
0
|
||||||
| 06.10.2012, 00:02 | |
|
Ответы с готовыми решениями:
34
Как правильно подключить два винчестера(один sata, другой ide)? |
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|||||||||||||||||||||
| 07.10.2012, 21:50 | |||||||||||||||||||||
Сообщение было отмечено как решение
Решение
func.h
Клюс -c говорит, что необходимо остановится сразу после генерации объектного кода, а не вызывать линкёр и генерировать бинарный файл. В первой строке отдельно компилируется файл func.cpp, на выходе будет объектный файл func.o. Здесь компилятору неважно, что эта функция где-то вызывается. Ему вообще не важно, вызывается она или нет. Его просят откомпилировать исходный файл в объектный, и он это делает. Во второй строке отдельно компилируется файл main.cpp, на выходе объектный файл main.o. Компилятор при встрече вызова функции, определения которой не видит, вместо кода вызова этой функции (в котором фигурирует адрес, по которому она располагается в исполняемом файле) поставит заглушку, содержащую всю необходимую информацию, по которой линкёр сможет заглушку эту изменить на реальный адрес вызываемой функции (важно, чтобы он не ошибся и не подставил туда какой-то другой адрес, поэтому и нужна информативная заглушка). Всё, больше компилятору ничего не нужно, он не хочет видеть здесь тело функции, а возлагает поиск этого тела на линкёр. В третьей строке, хотя и вызывается компилятор g++, на самом деле он сразу же вызовет линкёр (утилита ld), который сделает следующее (в неформальном виде, только для общего понимания процесса): отыщет все заглушки, поставленные компилятором, расшифрует информацию, которая в них хранится, найдёт в других объектных файлах реализации функций, соответствующих заглушкам, и заменит заглушки на код вызовов этих функций. В случае, если реализации какой-либо функции найдено не будет - линкёр выдаст ошибку о неразрешённой внешней ссылке. В случае множественного определения также будет выдана ошибка. Именно из-за всего, написанного выше, линкёру и нужно передавать ВСЕ объектные модули, которые ранее компилировались по-отдельности, ведь линкёр должен располагать всеми адресами всех используемых функций.
4
|
|||||||||||||||||||||
|
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
|
|
| 07.10.2012, 21:53 [ТС] | |
|
alsav22, хм, вы правы. Попробовал - почти все прояснилось. Единственное:
Я правильно понимаю, что если есть некий заголовочный файл, в нем прототипы функций, то компилятор полезет в точно так же названный cpp файл за этими функциями?
0
|
|
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
||
| 07.10.2012, 22:03 | ||
|
0
|
||
|
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
|
|
| 07.10.2012, 22:03 [ТС] | |
|
silent_1991, хм. Не совсем понимаю смысл создавать отдельный cpp, если потом в него включается .h. Ведь есть в хедере изменить хоть 1 несущественный символ, компилировать придется заново. Разве это не сводит всю прелесть на нет?
Так же, не понимаю, разве двойное включение <iostream> не сделает хуже? ведь оба файла компилируются отдельно. И получается в обоих .o будет код из iostream
0
|
|
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
||
| 07.10.2012, 22:06 | ||
|
0
|
||
|
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
|
|
| 07.10.2012, 22:09 [ТС] | |
|
silent_1991, а как линкер поймет, из какого файла брать реализацию?
0
|
|
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
| 07.10.2012, 22:11 | |
|
Kgfq, ну ведь на момент вызова у него есть вся необходимая информация, все файлы с реализацией ему предоставлены. Здесь в ход вступает такая вещь, как таблица символов, которая является, по сути, индексом всего содержимого объектного файла. Если линкёр находит в таблице символов символ, соответствующий разрешаемой им в данный момент заглушке, он берёт из этой таблицы смещение и подставляет его вместо заглушки.
Возможно, я несколько не точен в деталях реализации, но концепция такая.
0
|
|
|
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
||
| 07.10.2012, 22:13 | ||
|
0
|
||
|
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
|
|
| 07.10.2012, 22:22 [ТС] | |
|
alsav22, как я себе представлял это - реализация должна абстрагироваться от остального кода.
Какая разница, какие классы есть в коде, когда этой функции нужно подать определенное значение и она должна его как-то изменить.
0
|
|
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
| 07.10.2012, 22:32 | |
|
Kgfq, так она и абстрагирована. Возьмите мой пример. В main.cpp абсолютно ничего неизвестно о реализации func. Всё это дело склеивается в единый монолит на самой последней стадии - стадии линковки.
0
|
|
|
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
| 07.10.2012, 22:50 | |
|
0
|
|
|
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
|
|
| 07.10.2012, 23:05 [ТС] | |
|
silent_1991,
alsav22, Спасибо за подробные объяснения, я разобрался. Единственное, еще вопрос, когда стоит начинать задумываться о разделении прототипа и реализации?
0
|
|
|
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
||
| 07.10.2012, 23:14 | ||
|
Добавлено через 4 минуты Стоит сказать ещё о шаблонах. Прототип шаблона и реализация должны быть в одном файле.
1
|
||
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
| 08.10.2012, 01:12 | |
|
Kgfq, задумываться стоит сразу. Ещё почитайте о системах сборки, например, make. Именно с ними все прелести раздельной компиляции показываются наружу.
На счёт шаблонов: иными словами, шаблон - единственный случай, когда подключается не объявление, а полностью реализация. Такова особенность шаблонов.
0
|
|
|
36 / 36 / 0
Регистрация: 09.08.2012
Сообщений: 132
|
|||||||||||||||||
| 08.10.2012, 04:50 | |||||||||||||||||
0
|
|||||||||||||||||
| 08.10.2012, 04:50 | |
|
Как правильно перенести сайт с одного хостинга на другой? Как правильно передать метод делегата из одного класса в другой? Как ПРАВИЛЬНО перенести windows 7 с одного компьютера на другой через образ? Как подключить cpp-файл к h-файлу? Как подключить элементы из cpp файла? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет!
За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|