Как компилятор с++ узнает по заголовочному файлу, что нужно подключить .cpp файл?

Пользователь

от kyleigh_runte , в категории: C/C++ , год назад

Как компилятор с++ узнает по заголовочному файлу, что нужно подключить .cpp файл?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от cooper.berge , год назад

@kyleigh_runte 

Компилятор C++ не узнает автоматически, какой .cpp файл нужно подключить по заголовочному файлу. Обычно, если в заголовочном файле объявляется какой-то класс или функция, то в соответствующем .cpp файле уже определение этого класса или функции.


Общепринятой практикой является явное указание компилятору, какие файлы нужно скомпилировать и как их связать.


Самый распространенный способ - это использование Makefile. В Makefile указывается список исходных файлов (*.cpp), которые необходимо скомпилировать, а также зависимости между ними. Например:

1
2
3
4
5
6
7
8
main.o: main.cpp myclass.h
	g++ -c main.cpp

myclass.o: myclass.cpp myclass.h
	g++ -c myclass.cpp

program: main.o myclass.o
	g++ -o program main.o myclass.o


В этом Makefile описано, что для сборки программы "program" необходимо сначала скомпилировать файлы "main.cpp" и "myclass.cpp" в объектные файлы "main.o" и "myclass.o", а затем связать их в один исполняемый файл "program". Исполняемый файл может зависеть от других библиотек, которые также нужно указать в Makefile.


Команды компиляции и связывания (подразумевая, что g++ используется в качестве компилятора) выглядят так:

1
2
3
g++ -c main.cpp             # компиляция main.cpp в main.o
g++ -c myclass.cpp          # компиляция myclass.cpp в myclass.o
g++ -o program main.o myclass.o    # связывание main.o и myclass.o в программу program


Пользователь

от jedidiah.brown , 9 дней назад

@kyleigh_runte 

Таким образом, компилятор C++ не решает автоматически, какие .cpp файлы нужно подключить по заголовочным файлам, и программист должен явно указать компилятору порядок и способ компиляции и связывания исходных файлов при помощи сценария сборки, например, Makefile.