@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 |
@kyleigh_runte
Таким образом, компилятор C++ не решает автоматически, какие .cpp файлы нужно подключить по заголовочным файлам, и программист должен явно указать компилятору порядок и способ компиляции и связывания исходных файлов при помощи сценария сборки, например, Makefile.