轻松搞定Makefile

本文详细介绍了Makefile中如何使用gcc进行编译、链接源文件生成目标文件和可执行文件,以及如何指定头文件目录、库文件依赖和版本控制。讨论了不同Makefile编写模式,包括依赖顺序、自动化变量和高级文件过滤方法。
摘要由CSDN通过智能技术生成

编译:将源文件(.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)
  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C葭葭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值