cpp在编译的时候将cpp后缀为一个单位进行编译(可看下面带头文件的编译):self.ws.run_forever(sslopt={“cert_reqs”: ssl.CERT_NONE})
1、以cpp后缀为单位,将每个cpp文件编译成obj文件,即.o文件。首先把当前cpp文件需要的头文件全都复制粘贴过来,然后判断函数逻辑,注意这里只判断每个被调用的函数是否有声明,不判断当前声明是否有对应的定义。
2、将第一步中编译的.o文件链接起来。这里就要对第一步的.o文件中的每个声明去寻找定义,若没有对应的定义或重复定义,则会报错。也就是链接头文件和源文件的过程(确切的说是链接声明和定义的过程)
1、首先把当前cpp文件需要的头文件全都复制粘贴过来
2、判断函数逻辑,注意这里只判断每个被调用的函数是否有声明,不判断当前声明是否有对应的定义。
3、
subst、patsubst
foreach:
dir: 创建文件
常用通用变量
notdir、filter、bassename
编译过程
cpp_srcs := $(shell find src -name *.cpp)
cpp_objs := $(patsubst src/%.cpp,objs/%.o,$(cpp_srcs))
objs/%.o : src/%.cpp
mkdir -p $(dir $@)
g++ -c $< -o $@
workspace/exec : ${cpp_objs}
mkdir -p ${dir $@}
g++ $^ -o $@
run : workspace/exec
./$<
objects : $(cpp_objs)
debug:
@echo $(cpp_objs)
clean:
@rm -rf src/*.i src/*.s objs
.PHONY : debug preprocess clean
运行结果:
[duyunfei@localhost test]$ make run
mkdir -p objs/
g++ -c src/add.cpp -o objs/add.o
mkdir -p objs/
g++ -c src/minus.cpp -o objs/minus.o
mkdir -p objs/
g++ -c src/main.cpp -o objs/main.o
mkdir -p workspace/
g++ objs/add.o objs/minus.o objs/main.o -o workspace/exec
./workspace/exec
a + b = 15
a - b = 5
[duyunfei@localhost test]$
编译选项
带头文件的编译
cpp_srcs := $(shell find src -name *.cpp)
cpp_objs := $(patsubst src/%.cpp,objs/%.o,${cpp_srcs})
include_path := /home/duyunfei/test/include
I_flags := $(include_path:%=-I%)
compile_options := -g -O3 -w $(I_flags)
objs/%.o : src/%.cpp
mkdir -p $(dir $@)
g++ -c $< -o $@ $(compile_options)
workspace/exec : $(cpp_objs)
mkdir -p $(dir $@)
g++ $^ -o $@
run : workspace/exec
./$<
debug:
@echo ${cpp_srcs}
@echo ${cpp_objs}
@echo ${I_flags}
@echo $(compile_options)
clean:
rm -rf objs workspace/exec
.PHONY : run debug clean
[duyunfei@localhost test]$ make run
mkdir -p objs/
g++ -c src/add.cpp -o objs/add.o -g -O3 -w -I/home/duyunfei/Test/test/include
mkdir -p objs/
g++ -c src/minus.cpp -o objs/minus.o -g -O3 -w -I/home/duyunfei/Test/test/include
mkdir -p objs/
g++ -c src/main.cpp -o objs/main.o -g -O3 -w -I/home/duyunfei/Test/test/include
mkdir -p workspace/
g++ objs/add.o objs/minus.o objs/main.o -o workspace/exec
./workspace/exec
a + b = 15
a - b = 5
生成静态库(.a)
1、编译静态库文件
lib_srcs := $(filter-out src/main.cpp,$(shell find src -name *.cpp))
lib_objs := $(patsubst src/%.cpp,objs/%.o,$(lib_srcs))
include_paths := ./include
I_options := $(include_paths:%=-I%)
compile_flags := -g -O3 -std=c++11 $(I_options)
objs/%.o : src/%.cpp
mkdir -p $(dir $@)
g++ -c $^ -o $@ $(compile_flags)
lib/libxxx.a : $(lib_objs)
mkdir -p $(dir $@)
ar -r $@ $^
static_lib : lib/libxxx.a
clean :
rm -rf objs lib
debug :
@echo $(lib_srcs)
@echo $(lib_objs)
.PHONY : debug static_lib clean
[duyunfei@localhost compile_static_lib]$ make static_lib
mkdir -p objs/
g++ -c src/add.cpp -o objs/add.o -g -O3 -std=c++11 -I./include
mkdir -p objs/
g++ -c src/minus.cpp -o objs/minus.o -g -O3 -std=c++11 -I./include
mkdir -p lib/
ar -r lib/libxxx.a objs/add.o objs/minus.o
ar: 正在创建 lib/libxxx.a
2、运行静态库
lib_srcs := $(filter-out src/main.cpp,$(shell find src -name *.cpp))
lib_objs := $(patsubst src/%.cpp,objs/%.o,$(lib_srcs))
include_paths := ./include
library_paths := ./lib
linking_libs := xxx
I_options := $(include_paths:%=-I%)
l_options := $(linking_libs:%=-l%)
L_options := $(library_paths:%=-L%)
compile_flags := -g -O3 -std=c++11 $(I_options)
linking_flags := $(l_options) $(L_options)
# ======================= 编译静态库文件
objs/%.o : src/%.cpp
mkdir -p $(dir $@)
g++ -c $^ -o $@ $(compile_flags)
lib/libxxx.a : $(lib_objs)
mkdir -p $(dir $@)
ar -r $@ $^
static_lib : lib/libxxx.a
# ======================= 链接静态库文件
objs/main.o : src/main.cpp
mkdir -p $(dir $@)
g++ -c $< -o $@ $(compile_flags)
workspace/exec : objs/main.o
mkdir -p $(dir $@)
g++ $< -o $@ $(linking_flags)
run : workspace/exec
./$<
clean :
rm -rf objs lib
debug :
@echo $(lib_srcs)
@echo $(lib_objs)
.PHONY : debug static_lib clean
./workspace/exec
a + b = 15
a - b = 5
动态库编译与调用
cpp_srcs := $(shell find src -name *.cpp)
cpp_objs := $(patsubst src/%.cpp,objs/%.o,$(cpp_srcs))
so_objs := $(filter-out objs/main.o,$(cpp_objs))
include_dirs := /home/duyunfei/Test/compile_dynamic_lib/include
library_dirs := /home/duyunfei/Test/compile_dynamic_lib/lib
linking_libs := ddd
I_options := $(include_dirs:%=-I%)
l_options := $(linking_libs:%=-l%)
L_options := $(library_dirs:%=-L%)
r_options := $(library_dirs:%=-Wl,-rpath=%)
linking_options := $(l_options) $(L_options) $(r_options)
compile_options := -g -O3 -w -fpic
objs/%.o : src/%.cpp
mkdir -p $(dir $@)
g++ -c $^ -o $@ $(compile_options) $(I_options)
compile : $(cpp_objs)
lib/libddd.so : $(so_objs)
mkdir -p $(dir $@)
g++ -shared $^ -o $@
dynamic : lib/libddd.so
workspace/exec : objs/main.o
mkdir -p $(dir $@)
g++ $< -o $@ $(linking_options)
run : lib/libddd.so workspace/exec
./workspace/exec
clean :
rm -rf objs lib workspace
debug:
@echo $(cpp_srcs)
@echo $(so_objs)
.PHONY : debug clean compile
[duyunfei@localhost compile_dynamic_lib]$ make run
mkdir -p objs/
g++ -c src/add.cpp -o objs/add.o -g -O3 -w -fpic -I/home/duyunfei/Test/compile_dynamic_lib/include
mkdir -p objs/
g++ -c src/minus.cpp -o objs/minus.o -g -O3 -w -fpic -I/home/duyunfei/Test/compile_dynamic_lib/include
mkdir -p lib/
g++ -shared objs/add.o objs/minus.o -o lib/libddd.so
mkdir -p objs/
g++ -c src/main.cpp -o objs/main.o -g -O3 -w -fpic -I/home/duyunfei/Test/compile_dynamic_lib/include
mkdir -p workspace/
g++ objs/main.o -o workspace/exec -lddd -L/home/duyunfei/Test/compile_dynamic_lib/lib -Wl,-rpath=/home/duyunfei/Test/compile_dynamic_lib/lib
./workspace/exec
a + b = 15
a - b = 5
[duyunfei@localhost compile_dynamic_lib]$