「英语」C++ Makefile
Makefiles are special format files that together with the make utility will help you to automagically build and manage your projects. (From davetang.org)
Compile Steps:
- Preprocessing the source code.
- Compiling the source code.
- Assembling the compiled file.
- Linking the object code file to create an executable file.
▲ (The photo above is from: niu.edu)
Create Object File
This is accomplished by adding the -c
directive to the g++/gcc compiler
g++ -c testFile.cpp
- ->
testFile.o
- ->
The
-c
option lets us compile and get around certain restrictions- Such as not requiring a
main()
function
- Such as not requiring a
- The
.o
file is compiled code that doesn't have enough information to run by itself. and therefore is not executable.
Makefile
A Makefile consists several entries:
Each entry has:
- A target (usually a file)
- Dependencies (files which the target depends on)
- Commands (based on the target and dependencies)
<target> : <dependancy list>
<command>
For example:
testFile.o: testFile.cpp testFile.h foo.h
g++ -Wall -c testFile.cpp
Interpretation: If we want to create testFile.o
, then testFile.cpp
, testFile.h
, foo.h
must exist. If they do, run the command g++ -Wall -c testFile.cpp
.
A First Sample Makefile
Imagine a project has 3 files
circle.cpp circle.h main.cpp
circle.h
is the header file. circle.cpp
is the implementation of circle.h
header file. main.cpp
is the entry file.
To create a Makefile
exe: circle.o main.o
g++ -g -Wall circle.o main.o -o exe
circle.o: circle.h circle.hpp
g++ -g -Wall -c circle.cpp
main.o: circle.h main.cpp
g++ -g -Wall -c main.cpp
clean:
rm *.o exe *~ -v
Interpretation: If we want to create exe
, then circle.o
, main.o
must exist. They don't, generate a circle.o
and main.o
through the following command. Finally, create an exe
file.
It is brute force, but it works.
Makefile Macros
OBJS = circle.o main.o
CC = g++
DEBUG = -g
CFLAGS = -Wall -c $(DEBUG)
LFLAGS = -Wall $(DEBUG)
EXE = exe
$(EXE): $(OBJS)
$(CC) $(LFLAGS) $(OBJS) -o $(EXE)
circle.o: circle.h
$(CC) $(CFLAGS) circle.cpp
main.o: circle.h
$(CC) $(CFLAGS) main.cpp
clean:
rm *.o $(EXE) *~ -v
评论已关闭