Вот файл makefile, который будет компилировать каждый файл cpp в текущем каталоге в program
. Это GNU делает конкретным. Обратите внимание, что на FreeBSD, make
не GNU make! Вам нужно установить и запустить gmake.
CPPFLAGS := # flags for preprocessing: -D -I etc.
CXXFLAGS := -Wall -pedantic -Wextra -Wformat=2
LDFLAGS := # linker options, like -L/usr/local/boost/lib
LDLIBS := # libraries to link to, e.g. -lboost_system
SOURCES := $(wildcard *.cpp)
OBJECTS := $(SOURCES:.cpp=.o)
all: program # by convention, the first (default) target is called "all"
program: $(OBJECTS)
$(LINK.o) $^ $(LDLIBS) -o [email protected]
clean:
rm -f $(OBJECTS) program
GNU make имеет встроенные правила для построения .o от .cpp; мы просто должны предоставить некоторые параметры этому правилу (CPPFLAGS, CXXFLAGS).
Он также знает, как сделать program
из одного program.o
. Это не полезно в нашем случае, потому что есть несколько файлов .o. Поэтому мы должны прямо сказать, что program
зависит от объектных файлов и рецепт его создания.
Если у вас есть foo.cpp и bar.cpp в текущем каталоге, SOURCES
будет иметь значение foo.cpp bar.cpp
и OBJECTS
будет foo.o bar.o
. Когда вы вызываете make
без явной цели, он пытается создать первую цель, которую видит (все). all
зависит от program
, поэтому make пытается построить program
. Make видит, что program
нуждается в foo.o
и bar.o
, но их не существует. К счастью, make видит, что есть foo.cpp
, и он знает, как создать foo.o
; то же самое с bar.o
. После того, как он скомпилирует файлы C++ для создания объектных файлов, он может продолжить и связать их для получения program
Если речь идет только о компиляции 'for a in * .cpp; do g ++ -c $ a; done' ;-) , Но я думаю, это не то, что вы ищете. Более конкретно. – Oncaphillis