一些通用的Makefile文件模板(转载)-CODESYS移植-酷德网 - CoDeSys软件教程下载,CoDeSys工控资讯门户 

酷德网

HSC6490-cn中国制造,中国芯~
查看: 281|回复: 0

一些通用的Makefile文件模板(转载)

[复制链接]
  • TA的每日心情
    开心
    2017-11-20 22:07
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2026-3-18 10:29:46 | 显示全部楼层 |阅读模式
    这里写自定义目录标题

      写在前面
        3个MakeFile模板2.1 编译可执行文件Makefile2.2 编译静态库Makefile2.2 编译静态库Makefile


    写在前面

    对于Windows下开发,很多IDE都集成了编译器,如Visual Studio,提供了“一键编译”,编码完成后只需一个操作即可完成编译、链接、生成目标文件。
    Linux开发与Windows不同,Linux下一般用的的gcc/g++编译器,如果是开发ARM下的Linux程序,还需用到arm-linux-gcc/arm-linux-g++交叉编译器。
    Linux下也可以实现“一键编译”功能,此时需要一个编译脚本“Makefile”,Makefile可以手动编写,也可以借助自动化构建工具(如scons、CMake)生成。手动编写Makefile是Linux和Windows程序员的区别之一,一般地一个通用的Makefile能够适合大部分Linux项目程序。
    3个MakeFile模板

    2.1 编译可执行文件Makefile
    1. VERSION  =1.00
    2. CC   =gcc
    3. DEBUG   =-DUSE_DEBUG
    4. CFLAGS  =-Wall
    5. SOURCES   =$(wildcard ./source/*.c)
    6. INCLUDES   =-I./include
    7. LIB_NAMES  =-lfun_a -lfun_so
    8. LIB_PATH  =-L./lib
    9. OBJ   =$(patsubst %.c, %.o, $(SOURCES))
    10. TARGET  =app
    11. #links
    12. $(TARGET):$(OBJ)
    13. @mkdir -p output
    14. $(CC) $(OBJ) $(LIB_PATH) $(LIB_NAMES) -o output/$(TARGET)$(VERSION)
    15. @rm -rf $(OBJ)
    16. #compile
    17. %.o: %.c
    18. $(CC) $(INCLUDES) $(DEBUG) -c $(CFLAGS) $< -o $@
    19. .PHONY:clean
    20. clean:
    21. @echo "Remove linked and compiled files......"
    22. rm -rf $(OBJ) $(TARGET) output
    复制代码
    【要点说明】
    【1】程序版本
    开发调试过程可能产生多个程序版本,可以在目标文件后(前)增加版本号标识。
    1. VERSION = 1.00
    2. $(CC) $(OBJ) $(LIB_PATH) $(LIB_NAMES) -o output/$(TARGET)$(VERSION)
    复制代码
    【2】编译器选择
    Linux下为gcc/g++;arm下为arm-linux-gcc;不同CPU厂商提供的定制交叉编译器名称可能不同,如Hisilicon“arm-hisiv300-linux-gcc”。
    1. CC = gcc
    复制代码
    【3】宏定义
    开发过程,特殊代码一般增加宏条件来选择是否编译,如调试打印输出代码。-D是标识,后面接着的是“宏”。
    1. DEBUG =-DUSE_DEBUG
    复制代码
    【4】编译选项
    可以指定编译条件,如显示警告(-Wall),优化等级(-O)。
    1. CFLAGS =-Wall -O
    复制代码
    【5】源文件
    指定源文件目的路径,利用“wildcard”获取路径下所有依赖源文件。
    1. INCLUDES =-I./include
    复制代码
    【6】头文件
    包含依赖的头文件,包括源码文件和库文件的头文件。
    1. INCLUDES =-I./include
    复制代码
    【7】库文件名称
    指定库文件名称,库文件有固定格式,静态库为libxxx.a;动态库为libxxx.so,指定库文件名称只需写“xxx”部分,
    1. LIB_NAMES =-lfun_a -lfun_so
    复制代码
    【8】库文件路径
    指定依赖库文件的存放路径。注意如果引用的是动态库,动态库也许拷贝到“/lib”或者“/usr/lib”目录下,执行应用程序时,系统默认在该文件下索引动态库。
    1. LIB_PATH =-L./lib
    复制代码
    【9】目标文件
    调用“patsubst”将源文件(.c)编译为目标文件(.o)。
    1. OBJ =$(patsubst %.c, %.o, $(SOURCES))
    复制代码
    【10】执行文件
    执行文件名称
    1. TARGET =app
    复制代码
    【11】编译
    1. %.o: %.c
    2. $(CC) $(INCLUDES) $(DEBUG) $(CFLAGS) $< -o $@
    复制代码
    【12】链接
    可创建一个“output”文件夹存放目标执行文件。链接完输出目标执行文件,可以删除编译产生的临时文件(.o)。
    1. $(TARGET):$(OBJ)
    2. @mkdir -p output
    3. $(CC) $(OBJ) $(LIB_PATH) $(LIB_NAMES) -o output/$(TARGET).$(VERSION)
    4. @rm -rf $(OBJ)
    复制代码
    【13】清除编译信息
    执行“make clean”清除编译产生的临时文件。
    1. .PHONY:clean
    2. clean:
    3. @echo "Remove linked and compiled files......"
    4. rm -rf $(OBJ) $(TARGET) output
    复制代码
    2.2 编译静态库Makefile
    1. VERSION     =
    2. CC          =gcc
    3. DEBUG   =
    4. CFLAGS  =-Wall
    5. AR   =ar
    6. ARFLAGS     =rv
    7. SOURCES   =$(wildcard *.c)
    8. INCLUDES    =-I.
    9. LIB_NAMES   =
    10. LIB_PATH  =
    11. OBJ         =$(patsubst %.c, %.o, $(SOURCES))
    12. TARGET      =libfun_a
    13. #link
    14. $(TARGET):$(OBJ)
    15. @mkdir -p output
    16. $(AR) $(ARFLAGS) output/$(TARGET)$(VERSION).a $(OBJ)
    17. @rm -rf $(OBJ)
    18. #compile
    19. %.o: %.c
    20. $(CC) $(INCLUDES) $(DEBUG) -c $(CFLAGS) $< -o $@
    21.   
    22. .PHONY:clean
    23. clean:
    24. @echo "Remove linked and compiled files......"
    25. rm -rf $(OBJ) $(TARGET) output
    复制代码
    【要点说明】
    基本格式与“编译可执行Makefile”一致,不同点包括以下。
    【1】使用到“ar”命令将目标文件(.o)链接成静态库文件(.a)。静态库文件固定命名格式为:libxxx.a。
    2.2 编译静态库Makefile
    1. VERSION   =
    2. CC        =gcc
    3. DEBUG     =
    4. CFLAGS    =-fPIC -shared
    5. LFLAGS   =-fPIC -shared
    6. SOURCES   =$(wildcard *.c)
    7. INCLUDES  =-I.
    8. LIB_NAMES =
    9. LIB_PATH  =
    10. OBJ       =$(patsubst %.c, %.o, $(SOURCES))
    11. TARGET    =libfun_so
    12. #link
    13. $(TARGET):$(OBJ)
    14. @mkdir -p output
    15. $(CC) $(OBJ) $(LIB_PATH) $(LIB_NAMES) $(LFLAGS) -o output/$(TARGET)$(VERSION).so
    16. @rm -rf $(OBJ)
    17. #compile
    18. %.o: %.c
    19. $(CC) $(INCLUDES) $(DEBUG) -c $(CFLAGS) $< -o $@
    20. .PHONY:clean
    21. clean:
    22. @echo "Remove linked and compiled files......"
    23. rm -rf $(OBJ) $(TARGET) output
    复制代码
    【要点说明】
    基本格式与“编译可执行Makefile”一致,不同点包括以下。
    【1】编译选项和链接选项增加“-fPIC -shared ”选项。动态库文件固定命名格式为libxxx.so。
    +10
    不赞一个?
    打赏鼓励一下!
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

    本版积分规则

    
    顶部qrcode底部
    关注酷德网订阅号,获取更多资讯!

    QQ|Archiver|手机版|小黑屋|酷德论坛 ( 苏ICP备16065247号-1 )|网站地图

    GMT+8, 2026-10-30 13:07 , Processed in 0.151195 second(s), 42 queries .

    酷德网

    © 2001-2013 Hicodesys. 技术支持 by 酷德网

    快速回复 返回顶部 返回列表