Многие из моих студентов с трудом понимают компиляцию C ++, когда она применяется к нескольким файлам, принадлежащим одному проекту.

Проект C ++, что-то, что дает вам один исполняемый файл, может состоять из нескольких файлов. Число может достигать 1000 для сложных проектов, таких как Adobe Photoshop или Google Chrome.

Теперь, если я дам вам этот исходный код, вы сможете его скомпилировать и получить исполняемый файл, который можно будет дважды щелкнуть; а софт запускается ??? Это было бы болезненно (если не сложно) даже для эксперта.

Что если я дам вам список инструкций и программу, которая может выполнять эти инструкции и делать эту компиляцию за вас. Конечный продукт будет исполняемым файлом. Разве это не здорово. Нет! Это превосходно.

Это то, что мы собираемся здесь узнать. Как записать инструкции в файл, который будет выполняться программой для автоматизации процесса сборки (или произвольной компиляции).

Файл, который мы собираемся написать, называется Makefile.

Программа, которую мы собираемся использовать, называется make.

Многофайловое программирование на C ++

Давайте рассмотрим одну программу для деления 2 чисел. Нам потребуются следующие файлы:

  1. 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.