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 为前缀。

    

Linux学习笔记——例说makefile 综合案例的更多相关文章

  1. Linux学习笔记——例说makefile 索引博文

    0.前言     从学习C语言開始就慢慢開始接触makefile.查阅了非常多的makefile的资料但总感觉没有真正掌握makefile,假设自己动手写一个makefile总认为非常吃力.所以特意借 ...

  2. [转]Linux学习笔记——例说makefile 头文件查找路径

    0.前言     从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力.所以特意借助 ...

  3. Linux学习笔记——例说makefile 头文件查找路径

    0.前言     从学习C语言開始就慢慢開始接触makefile,查阅了非常多的makefile的资料但总感觉没有真正掌握makefile,假设自己动手写一个makefile总认为非常吃力.所以特意借 ...

  4. Linux 学习笔记

    Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...

  5. linux —— 学习笔记(汇总)

    笔记目录:一.系统知识 和 基本概念                    二.常用操作                   三.系统管理(内存.设备.服务等管理)                   ...

  6. Linux 学习笔记之超详细基础linux命令(the end)

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 14---------------- ...

  7. Linux 学习笔记之超详细基础linux命令 Part 13

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 12---------------- ...

  8. Linux 学习笔记之超详细基础linux命令 Part 12

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 11---------------- ...

  9. Linux 学习笔记之超详细基础linux命令 Part 11

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 10---------------- ...

随机推荐

  1. WIFI万能钥匙协议分析

    WIFI万能钥匙协议分析 需求: 上android 市场下载任意一款,wifi万能钥匙 软件,对其进行 协议分析和逆向,达成如下结果:通过对软件的分析,完成自动化爬虫,爬wifi万能钥匙的wifi库, ...

  2. 严格次小生成树[BJWC2010] (树链剖分,倍增,最小生成树)

    题目链接 Solution 有几点关键,首先,可以证明次小生成树一定是由最小生成树改变一条边而转化来. 所以需要枚举所有非最小生成树的边\((u,v)\).并且找到 \(u\) 到 \(v\) 的边中 ...

  3. bzoj 3456 城市规划 无向简单连通图个数 多项式求逆

    题目大意 求n个点的无向简单连通图个数 做法1 \(f[i]\)表示i个点的无向简单连通图个数 \(g[i]=2^{\frac {i*(i-1)}{2}}\)表示i个点的无向简单图个数(不要求连通) ...

  4. mod性质 学习笔记

    mod性质小结 \(a\equiv b(\mod m)\) $ \rightarrow \( \)a-b=k*m,k\in Z$ \(a\equiv b且c\equiv d(\mod m)\) \(\ ...

  5. Linux用户空间与内核空间(理解高端内存)【转】

    转自:http://www.cnblogs.com/wuchanming/p/4360277.html Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递 ...

  6. hdu 5443(线段树水)

    The Water Problem Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

  7. 使用Python计算研究生学分绩(绩点)

    最近看了CSDN上一个专栏<Python爬虫入门教程>,其中最后一篇作者写了个例子,用爬虫计算山东大学绩点,顿时想到前一阵子搞测评的时候还得拿计算器一点点算自己的平均学分绩,也想写一个自己 ...

  8. OpenLDAP给我的启发

    首先这篇文章没什么技术性,但亮点是:我会给广大运维同行提一点建议,这个一点仅仅是一点,而不是很多点. 年前计划深度掌握一些诸如:Jenkins.Gitlab.ELK.k8s等的软件,但学着学着总是想学 ...

  9. chpasswd、dd命令、find实战、添加系统服务、buffer、cached

    1.如果两个文件的每一行想一一对应 paste 1.txt 2.txt # 文件3.txt中存放着用户跟密码,想要添加用户并设置密码: # 用户必须存在,文件格式必须是--用户名:密码 chpassw ...

  10. chrome mac 快捷键

    ⌘-N 打开新窗口. ⌘-T 打开新标签页. ⌘-Shift-N 在隐身模式下打开新窗口. 按 ⌘-O,然后选择文件. 在 Google Chrome 浏览器中打开计算机中的文件. 按住 ⌘ 键,然后 ...