Cpp1 App Makefile

You might also like

You are on page 1of 26

i make Makefile Ii

C++ . Make i Makefile


c ,
Creative Commons - Attribution Share Alike (CC BY-SA)
vk.com/indrekis
indrekis@gmail.com
i make Makefile Ii

i i 1

main_file.cpp

#include <iostream>

#include "file1 .h"


#include "file2 .h"

int main()
{
std :: cout << "Hello world from main!" << std::endl;

function_from_file1 ();

function_from_file2 ();

return 0;
}
i make Makefile Ii

i i 2
file1.h

#ifndef FILE1_HEADER
#define FILE1_HEADER

void function_from_file1 ();

#endif // FILE1_HEADER

file1.cpp

#include <iostream>

#include "file1 .h"

void function_from_file1()
{
std :: cout << "Hello world from __file__ 1!" << std::endl;
}
i make Makefile Ii

i i 3
file2.h

#ifndef FILE2_HEADER
#define FILE2_HEADER

void function_from_file2 ();

#endif // FILE2_HEADER

file2.cpp

#include <iostream>

#include "file2 .h"

void function_from_file2()
{
std :: cout << "Hello world from ~~~file~~~ 2!" << std::endl;
}
i make Makefile Ii

i ii ii
g++ -c main_file.cpp -o main_file.o
g++ -c file1.cpp -o file1.o
g++ -c file2.cpp -o file2.o
g++ file1.o file2.o main_file.o -o program
: i , ,
i, g++ C++ i i
GCC. i . i (ld)
, , ii i.
, i i i,
, i i i
.
, .
:
g++ main_file.cpp file1.cpp file2.cpp -o program
i i i ii.
, i i i
i. i , i i ,
i i.
i make Makefile Ii

make

make .
,
i i .
i i
, i , ii i
i .
Make , i .

i
i i, Makefile.
i make Makefile Ii

make

i i make "make"
, i .
i Makefile. 1 makefile.,
, ,
2 .
i, i ii, i:
make -f my_makefile_file.ext
make --file=my_makefile_file.ext
make --makefile=my_makefile_file.ext
Makefile i i i
ii. :
make targename
make -f my_makefile_file.ext targename

1
, , i i i i.
2
i ii i . i i i
i make.
i make Makefile Ii

Ii i make

i i3 :
-j N i, N i.
, .
-n, --dry-run ,
, i, i i i.
-k, --keep-going ,
. i make ii
i .
. i i make.

3
i , i . i, , "make help".
i make Makefile Ii

i Makefile
hellomake: main_file.cpp file1.cpp file2.cpp
g++ main_file.cpp file1.cpp file2.cpp -o hellomake

! , ,
i g++,
I. I make :
Makefile:2: *** missing separator. Stop.

hellomake i ii. , i
i, i , i i ,
. i
, i , make
hellomake.

ii make :
target: dependencies
[tab] command options
i make Makefile Ii

ii
i makefile i ii,
ii. , i
i. :
all: hellomake

hellomake: main_file.o file1.o file2.o


g++ main_file.o file1.o file2.o -o hellomake

main_file.o: main_file.cpp
g++ -c main_file.cpp

file1.o: file1.cpp
g++ -c file1.cpp

file2.o: file2.cpp
g++ -c file2.cpp
, g++
I!
i make Makefile Ii

make i, ,
.
i i . ""
(fulfilled), i i ii, i .
, i , all , i
i i hellomake. , , i
main_file.o, file1.o, file2.o.
i.
ii " " :
[...]$ make -f makefile.2
g++ -c main_file.cpp
g++ -c file1.cpp
g++ -c file2.cpp
g++ main_file.o file1.o file2.o -o hellomake
, i , i file2.c, i ,
:
[...]$ make -f makefile.2
g++ -c file2.cpp
g++ main_file.o file1.o file2.o -o hellomake
i make Makefile Ii

, i i, ii
i. , i GNU
make i gcc/g++, i ii. i i
:
all: hellomake

hellomake: main_file.o file1.o file2.o


g++ main_file.o file1.o file2.o -o hellomake

main_file.o: main_file.cpp file1.h file2.h


g++ -c main_file.cpp

file1.o: file1.cpp file1.h


g++ -c file1.cpp

file2.o: file2.cpp file2.h


g++ -c file2.cpp
i make Makefile Ii

i clean
i ii ii. ,
i, clean:
all: hellomake

hellomake: main_file.o file1.o file2.o


g++ main_file.o file1.o file2.o -o hellomake

main_file.o: main_file.cpp file1.h file2.h


g++ -c main_file.cpp

file1.o: file1.cpp file1.h


g++ -c file1.cpp

file2.o: file2.cpp file2.h


g++ -c file2.cpp

.PHONY : clean
clean:
rm -rf *.o hellomake
".PHONY : clean" , i make i
i ii i clean.
i make Makefile Ii

i ii i ( make,
i, ), make
i.
# This is makefile
all: hellomake # default target
i make Makefile Ii

ii
makefile i i ,
.
ii.
CXX = g++

all: hellomake

hellomake: main_file.o file1.o file2.o


$(CXX) main_file.o file1.o file2.o -o hellomake

main_file.o: main_file.cpp file1.h file2.h


$(CXX) -c main_file.cpp

file1.o: file1.cpp file1.h


$(CXX) -c file1.cpp

file2.o: file2.cpp file2.h


$(CXX) -c file2.cpp

.PHONY : clean
clean:
rm -rf *.o hellomake
i make Makefile Ii

"" i i i. ii i
i i, i, :
CXX = g++
CXXFLAGS = -O3
LDLAGS = -O3
OBJS = main_file.o file1.o file2.o

all: hellomake

hellomake: $(OBJS)
$(CXX) $(OBJS) -o hellomake $(LDLAGS)

main_file.o: main_file.cpp file1.h file2.h


$(CXX) -c main_file.cpp $(CXXFLAGS)
..........................
i ii, :
CFLAGS =
i make Makefile Ii

ii, i

i i :
$@ i ii.
$* i ii .
$< .
$^ i i, ii i, i.
$+ , .
$? i , ii i.
i make Makefile Ii

:
CXX = g++
CXXFLAGS = -O3
LDLAGS = -O3
OBJS = main_file.o file1.o file2.o
PRG_NAME = hellomake

all: $(PRG_NAME)

$(PRG_NAME): $(OBJS)
$(CXX) $^ -o $@

main_file.o: main_file.cpp file1.h file2.h


$(CXX) -c $(CXXFLAGS) $<
file1.o: file1.cpp file1.h
$(CXX) -c $(CXXFLAGS) $<
file2.o: file2.cpp file2.h
$(CXX) -c $(CXXFLAGS) $<

.PHONY : clean
clean:
rm -rf *.o $(PRG_NAME)
i make Makefile Ii

, i i i *.cpp
i. , , i
, i i i i i (*.h).
:
CXX = g++
CXXFLAGS = -O3
LDLAGS = -O3
OBJS = main_file.o file1.o file2.o
PRG_NAME = hellomake
HEADERS = file1.h file2.h # <============

all: $(PRG_NAME)

$(PRG_NAME): $(OBJS)
$(CXX) $^ -o $@

%.o: %.cpp $(HEADERS) # <============


$(CXX) -c $(CXXFLAGS) $< # <============

.PHONY : clean
clean:
rm -rf *.o $(PRG_NAME)
i make Makefile Ii

Virtual Path VPATH

VPATH i, i,
i.
VPATH = src include
vpath , ,
i i i:
vpath %.cpp src
vpath %.h include
i make Makefile Ii

, . i
i i *.cpp i i,
:
SOURCES = $(wildcard *.cpp)
OBJS = $(subst .cpp,.o,$(SOURCES))
#
OBJS = $(subst .cpp,.o,$(SOURCES))
, :
SOURCES=main_file.cpp file1.cpp file2.cpp
OBJS=$(SOURCES:.cpp=.o)
/ ii (, /home/path/prj/)
:
$(patsubst %/,%,$(SOMEDIR))
, % "-".
i make Makefile Ii

Make , i i. ,
main_file.o: main_file.cpp
file1.o: file1.cpp
file2.o: file2.cpp
i :
$(CXX) -c $(CXXFLAGS) $<
, i CXX, CXXFLAGS (CC i CFLAGS C).

:
--print-data-base.
i make Makefile Ii

i i
GNU make GCC, i
i i i ,
i i.
<.... , i i ....>
all: $(PRG_NAME)

# i i i
-include $(OBJS:.o=.d)

$(PRG_NAME): $(OBJS)
$(CXX) $(LDLAGS) $^ -o $@

%.o: %.cpp
$(CXX) -c $(CXXFLAGS) $<
$(CXX) -MM -MP -MT $@ -MF $*.d $(CXXFLAGS) $<
# ii i

.PHONY : clean
clean:
rm -rf *.o *.d $(PRG_NAME)
i make Makefile Ii

i i.
. (i bin i obj i
ii!):
CXX = g++
CXXFLAGS = -O3
LDLAGS = -O3
PRG_NAME = hellomake
BIN_DIR = bin
OBJ_DIR = obj
SOURCES = main_file.cpp file1.cpp file2.cpp
OBJS = $(patsubst %.cpp,$(OBJ_DIR)/%.o,$(SOURCES))

all: $(BIN_DIR)/$(PRG_NAME)

i.
i make Makefile Ii

# i i i
-include $(OBJS:.o=.d)

$(BIN_DIR)/$(PRG_NAME): $(OBJS)
$(CXX) $(LDLAGS) $^ -o $@

$(OBJ_DIR)/%.o: %.cpp
$(CXX) -c $(CXXFLAGS) $< -o $@
$(CXX) -MM -MP -MT $@ -MF $(OBJ_DIR)/$*.d $(CXXFLAGS) $<
# ii i

.PHONY : clean
clean:
rm -rf $(OBJ_DIR)/*.o $(OBJ_DIR)/*.d $(BIN_DIR)/$(PRG_NAME)
i make Makefile Ii

i ., :
http://scottmcpeak.com/autodepend/autodepend.html
http://mad-scientist.net/make/autodep.html
ii i GNU make:
https://www.gnu.org/software/make/manual/html_node/
Automatic-Prerequisites.html
GCC: http://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/
Preprocessor-Options.htm "-MM", "-MP", "-MT",
"-MF". http://stackoverflow.com/questions/97338/
gcc-dependency-generation-for-a-different-output-directory
http://mad-scientist.net/make/multi-arch.html
http://stackoverflow.com/questions/5178125/
gnu-make-how-to-get-object-files-in-separate-subdirectory

You might also like