Многие из моих студентов с трудом понимают компиляцию C ++, когда она применяется к нескольким файлам, принадлежащим одному проекту.
Проект C ++, что-то, что дает вам один исполняемый файл, может состоять из нескольких файлов. Число может достигать 1000 для сложных проектов, таких как Adobe Photoshop или Google Chrome.
Теперь, если я дам вам этот исходный код, вы сможете его скомпилировать и получить исполняемый файл, который можно будет дважды щелкнуть; а софт запускается ??? Это было бы болезненно (если не сложно) даже для эксперта.
Что если я дам вам список инструкций и программу, которая может выполнять эти инструкции и делать эту компиляцию за вас. Конечный продукт будет исполняемым файлом. Разве это не здорово. Нет! Это превосходно.
Это то, что мы собираемся здесь узнать. Как записать инструкции в файл, который будет выполняться программой для автоматизации процесса сборки (или произвольной компиляции).
Файл, который мы собираемся написать, называется Makefile.
Программа, которую мы собираемся использовать, называется make.
Многофайловое программирование на C ++
Давайте рассмотрим одну программу для деления 2 чисел. Нам потребуются следующие файлы:
- div.h
2. div.cpp
3. main.cpp
Если я хочу скомпилировать эти файлы и преобразовать их в исполняемый файл, я бы написал в терминале следующее:
# Just translate the files. # Result would be div.o main.o in the present working directory g++ -c div.cpp g++ -c main.cpp # Do all the linking stuff g++ div.o main.o -o divisonExecutable
Написание нашего Makefile
Об этом нужно помнить. Теперь давайте напишем эквивалентный Makefile
Важно: операторы, начинающиеся с #, предназначены для людей и не должны вводиться в терминале. Но прочтите их.
# Makefile
# Specify what I need in the end. One single executable
divisonExecutable : main.o div.o
# Read this as divisionExecutable depends on main.o div.o
# But how is it produced??? Hmm...using the below statement
g++ main.o div.o -o divisonExecutable
# starts with tab, I repeat tab
#-----------------------------------------------------------------
# But main.o is not there? So specify how it is produced.
main.o : main.cpp div.h
g++ -c main.cpp
# Same for test.o
test.o : test.cpp test.h
g++ -c test.cpp
Итак, мы написали Makefile, содержащий инструкции по автоматизации процесса компиляции. Программа, которая понимает это, - это make.
Так что просто напишите
make
Ага! Просто make. make ищет makefile, если не найден, Makefile.
Если вам нужно указать собственное имя файла, вам нужно указать
make -f name-of-my-file-that-make-will-use
Когда вы запустите make, вы увидите следующее в своем pwd.
test.o
main.o
divisonExecutable
Если вы хотите узнать больше о make, посетите эти две статьи, которые я считаю очень полезными.
CMake
А что, если писать Makefile тоже утомительно. Для этого у нас есть cmake, который сгенерирует для нас Makefile.
Надеюсь, эта статья помогла вам разобраться в командах make и cmakebeyond.