zoukankan      html  css  js  c++  java
  • 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 为前缀。

        
  • 相关阅读:
    Android ADB 基本命令
    Android Studio修改包名
    Android开发之SurfaceView
    Android呼吸灯效果实现
    Android xml 绘制图形
    设计模式--代理模式C++实现
    设计模式--建造者模式C++实现
    设计模式--模板方法模式C++实现
    设计模式--抽象工厂模式C++实现
    设计模式---工厂方法C++实现
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/6826484.html
Copyright © 2011-2022 走看看