Linux学习笔记——例说makefile 综合案例

0.前言
    从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力。所以特意借助博客总结makefile的相关知识,通过例子说明makefile的具体用法。
    例说makefile分为以下几个部分,更多内容请参考【 例说makefile索引博文
    1.只有单个C文件   
    2.含有多个C文件    
    3.需要包括头文件路径
    4.增加宏定义
    5.增加系统共享库
    6.增加自定义共享库
    7.一个实际的例子

    【代码仓库】—— makefile-example
    代码仓库位于bitbucket,可借助TortoiseHg(GUI工具)克隆代码或者在网页中直接下载zip包。
    【本例说明】
    本例借助开源项目freemodbus展开来分析makefile的具体用法,freemodbus包括多个平台的移植分支,本例主要从linuxTCP入手。本文将不会阐述freemodbus的具体用法,而是以makefile的用法为主。

1.makefile文件
    请替换其中的[tab],并以代码仓库中的makefile文件为主。
# 指定编译器
CC = gcc

# CFLAG包括头文件目录
CFLAGS = -g -Wall

# 头文件查找路径
INC = -Iport -I../../modbus/rtu \
  -I../../modbus/ascii -I../../modbus/include -I../../modbus/tcp

# 静态链接库
LDFLAGS = 
LDLIBS = -lpthread
# 目标
TARGET = tcpmodbus
# 源文件
SRC = demo.c port/portother.c \
 port/portevent.c port/porttcp.c \
 ../../modbus/mb.c ../../modbus/tcp/mbtcp.c \
 ../../modbus/functions/mbfunccoils.c \
 ../../modbus/functions/mbfuncdiag.c \
 ../../modbus/functions/mbfuncholding.c \
 ../../modbus/functions/mbfuncinput.c \
 ../../modbus/functions/mbfuncother.c \
 ../../modbus/functions/mbfuncdisc.c \
 ../../modbus/functions/mbutils.c

# 源文件编译为目标文件
OBJS = $(SRC:.c=.o)

# 链接为可执行文件
$(TARGET): $(OBJS)
[tab]$(CC) $^ -o $@ $(LDFLAGS) $(LDLIBS)

# 清除可执行文件和目标文件
clean:
[tab]rm -f $(OBJS)
[tab]rm -f $(TARGET)

# 编译规则 加入头文件 $@代表目标文件 $< 代表第一个依赖文件
%.o:%.c
[tab]$(CC) $(CFLAGS) $(INC) -o $@ -c $<

2.具体说明
    【1】freemodbus中的文件较多,INC包括所有的头文件查找路径,路径使用前缀-I表示,请注意若路径较多时通过"\"实现续行。
    【2】此处使用了共享库pthread,共享库的设备一般包括两个方面。第一,共享库的名称 DLIBS,共享库的查找路径LDFLAGS。由于pthread为系统共享库,使用了系统默认的查找路径 /usr/lib,所以LDFLAGS设置可以省略,若需要制定共享库目录,在目录前加入-L即可。
    【3】$(CC) $^ -o $@  $(LDFLAGS) $(LDLIBS) 和共享库设置有关的参数需要放在链接指令中。请注意共享库应该插入链接过程中而不是编译过程。

3.执行过程
    make clean && make
    【控制台输出】
    输出内容较多,此处省略。

    【运行】
    sudo ./tcpmodbus
Type 'q' for quit or 'h' for help!
> h
FreeModbus demo application help:
  'd' ... disable protocol stack.
  'e' ... enabled the protocol stack
  's' ... show current status
  'q' ... quit applicationr
  'h' ... this information
> 

    【说明】
    【1】编译时加入了头文件查找路径。
    【2】链接时加入了共享库。

4.总结
    【1】LDIBS指定共享库,共享库以 -l 为前缀。
    【2】LDFLAGS指定共享库查找路径,路径以 -L 为前缀。
    
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
############################################################################# # Makefile for building: sample 2011-09-26 # # Project: # Template: # Command: # ------基本上简单用法的makefile------- #1. 第一个目标为最终目标 #2. 命令以 Tab开头,可以有多个命令 #3. 分行号\ 后面不可以跟空格 #4、加@可以去掉命令显示 #5. 变量为 abc = efd 访问为 $(abc) echo $abc # # # #缺点,单文件夹 #每次都会重新生成 # #foo.o : foo.c defs.h # foo模块 #cc -c -g foo.c # #多目录 一种方法,在主目录里面include "",然后其里面OBJS += .o,这样其实就是 或用foreach ############################################################################# #target EXECUTABLE := test CC := gcc CXX := g++ STRIP := strip AR := ar cqs LINK := g++ RM := rm -f CFLAGS := -g -Wall CXXFLAGS := $(CFLAGS) CXXFLAGS += -MD LIBS := -lm LIBPATH := -L/usr/local/lib INCPATH := ####### Output directory OBJSPATH := ../Obj/ EXECUTABLEPATH := ../Execute/ #######source Files SOURCE := $(wildcard *.c) $(wildcard *.cpp) OBJS := $(patsubst %.c, %.o, $(patsubst %.cpp, %.o, $(SOURCE))) DEPS := $(patsubst %.o,%.d,$(OBJS)) #######rule .SUFFIXES: .cpp .c .o .so .a .d $(OBJSPATH)%.o:%.c $(CC) $(CFLAGS) -c $< -o $@ $(OBJSPATH)%.o:%.cpp $(CXX) $(CXXFLAGS) -c $< -o $@ $(OBJSPATH)%.d:%.cpp $(CXX) -MM $ $@ ######main .PHONY : all deps objs clean rebuild all: $(EXECUTABLE) $(CXX) $(CXXFLAGS) $(INCLUDEPATH) $(LIBS) $(LIBPATH) $(addprefix $(OBJSPATH),$(OBJS)) \ -o $(EXECUTABLEPATH)$(EXECUTABLE) deps: $(addprefix $(OBJSPATH),$(DEPS)) objs: $(addprefix $(OBJSPATH),$(OBJS)) clean: @$(RM) $(OBJSPATH)*.o @$(RM) $(OBJSPATH)*.d @$(RM) $(EXECUTABLEPATH)$(EXECUTABLE) rebuild: clean all -include $(addprefix $(OBJSPATH),$(DEPS)) ##.d里面是详细的.o rule 自己会括展开的,然后没有文件就自己去重建 $(EXECUTABLE) : objs

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值