编译:将源文件(.cpp)编译生成目标文件(.o)
gcc -c main.cpp -o main.o
链接:将目标文件(.o)生成可执行文件
gcc main.o -o main
合并:
gcc main.cpp -o main -lstdc++
-I 指定头文件目录
-L 指定库文件依赖路径
-l 指明库文件名
查看版本
make --version
Makefile
方式一:
target:
g++ -I. add.cpp sub.cpp main.cpp -o main
target:目标名称,可以随意命名
g++ 前面不是空格,必须是tab缩进
Makefile 里如果有多个目标,可以通过make加目标名称来执行指定的
目标,如果不是指定目标,则默认选择第一个目标执行
make target 也可以直接输入make
方式二:
target: main
main:
g++ -I. add.cpp sub.cpp main.cpp -o main
注意:
"target: main"表示target目标依赖main目标
main为目标名称,可以随意命名
方式三:
target: add_o sub_o main_o main
main:
g++ -I. add.o sub.o main.o -o main
add_o:
g++ -I. -c add.cpp -o add.o
sub_o:
g++ -I. -c sub.cpp -o sub.o
main_o:
g++ -I. -c main.cpp -o main.o
注意:
依赖顺序,如果main 放前面存在找不到.o文件的错误
升级写法
模式规则
Makefile
target: add_o sub_o main_o main
main:
g++ -I. add.o sub.o main.o -o main
%.o: %.cpp
g++ -I. -c $< -o $@
说明:
%.o: %.cpp:所有的.o文件都由相同名称的.cpp文件编译生成
<:表示所有依赖的挨个值
@:表示所有目标的挨个值
这些奇怪的变量"<“、”@“我们叫"自动化变量”
变量替换
Makefile
OBJS = add_o sub_o main_o
target: ${OBJS} main
main:
g++ -I. ${OBJS} -o main
%.o: %.cpp
g++ -I. -c $< -o $@
clean:
rm -rf ${OBJS} main
高级写法
文件过滤
Makefile
#找出当前目录下,所有的源文件(以.cpp结尾)
SRCS := ${shell find ./* -type f | grep '\.cpp'}
${warning SRCS is ${SRCS}}
#确定cpp源文件对应的目标文件
OBJS := ${patsubst %.cpp, %.o, ${filter %.cpp, ${SRCS}}}
${warning OBJS is ${OBJS}}
target: ${OBJS} main
main:
g++ -I. ${OBJS} -o main
%.o: %.cpp
g++ -I. -c $< -o $@
clean:
rm -rf ${OBJS} main
编译选项
CFLAGS := -g -o2 -Wall -Werror -Wno-unused -ldl -std=c++11
静态库
./lib/libmul.a:${MUL_SRC:%.cpp=%.o}
ar rs $@ $^
动态库
./lib/libmul.so:${MUL_SRC:%.cpp=%.o}
gcc -I. -fPIC -shared -c $< -o $@
通过环境变量LD_LIBRARY_PATH来指定动态库查找目录
export LD_LIBRARY_PATH=./lib
CROSS =
#CROSS=/root/gcc-linaro-5.3.1-2016.05-i686_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
CC = $(CROSS)gcc
CXX = $(CROSS)g++
WORKDIR =/mnt/hgfs/Share/SOURCE/
#INSTALLPATH =/home/FCloudComm_jlx/
INSTALLPATH =/home/FCloudComm/
COMPILETYPE =26_
DDIRNAME =TRA_SHUILI_SDI
DEBUG =
CXXFLAGS = $(DEBUG) -Wall -fPIC -shared -I. -I$(WORKDIR) -I$(WORKDIR)include -I$(WORKDIR)Source -L$(INSTALLPATH)bin -lDeliverDriverST -lServiceAPI -ldl -lpublic
VERSION = 7.0.0.261
DRIVER = $(INSTALLPATH)delivers/$(DDIRNAME)/
TARGET = $(DRIVER)lib$(COMPILETYPE)$(DDIRNAME).so.${VERSION}
DIRS = .
FILES = $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cpp))
OBJS = $(patsubst %.cpp, %.o, $(FILES))
OTHERFILES = ./sqlite3.c
OTHEROBJS = $(patsubst %.c, %.o, $(OTHERFILES))
$(TARGET): $(OBJS) $(OTHEROBJS)
$(CXX) $(OBJS) $(OTHEROBJS) $(CXXFLAGS) -o $@
# cp -rf ../../xml/$(DDIRNAME).xml $(DRIVER)
$(OBJS):%.o:%.cpp
$(CXX) -c $< -o $@ $(CXXFLAGS)
$(OTHEROBJS):%.o:%.c
$(CC) -c $< -o $@ $(CXXFLAGS)
.PHONY: clean
clean:
$(RM) $(TARGET)
$(RM) $(OBJS)
$(RM) $(OTHEROBJS)