前文《【开发工具】之windows下gnu makefile编写》介绍了借助GUNWIN32编写windows下的Makefile,本文异曲同工,介绍在MINGW下编写windows下的makefile

1. 相关flag放在一个config.mk文件中

  小编习惯于将系统配置的相关flags放在一个独立的文件中,方便以后系统扩展,因此新建名为config.mk的文件,内容为:

OS := $(shell uname)
ifeq ($(findstring MINGW, $(OS)), MINGW)CC  := c99wrap clCPP   := c99wrap clAR    := libLD   := c99wrap linkRC  := rcASM   := yasmifeq ($(platform), x86_32)ARCH_DEF  :=OUT_DIR      := ../outEXTRA_CFLAGS  := -DWIN32EXTRA_ASMFLAGS   := -f win32 EXTRA_RCFLAGS  := -DWIN32
endififeq ($(platform), x86_64)ARCH_DEF :=OUT_DIR      := ../outEXTRA_CFLAGS  := -DWIN64EXTRA_ASMFLAGS   := -f x64 EXTRA_RCFLAGS    := -DWIN64
endifendif ##MINGW

2. makefile_lib的编写

  新建名为makefile的文件,内容为:

include config.mk### 假设库的目录结构如下且同一“-”长度的属于同一目录
###  -3rdparty       #第三方库相关的库文件
###  -src               #源码路径(包含C文件及头文件)
###  -demo           #demo示例源码路径
###  -build          #build目录下有各平台相关的文件夹
###  --windows       #windows文件夹
###  ---makefile_lib  #windows下lib的makefile
###  ---makefile_demo #windows下demo的makefile
###  ---dll_info.t   #资源文件模板
###  ---dll_info.rc  #资源文件
###  --objs          #obj文件输出目录
###  --out           #库输出目录
SRCS_DIR    := .../../src
OBJS_DIR    := ../objsvpath    %.c $(SRCS_DIR)/
vpath   %.asm $(SRCS_DIR)/vpath %.h $(SRCS_DIR)/C_SRCS  := $(wildcard $(SRCS_DIR)/*.c)
A_SRCS  := $(wildcard $(SRCS_DIR)/*.asm)C_OBJS := $(notdir $(subst .c,.o, $(C_SRCS)))
A_OBJS  := $(notdir $(subst .asm, .o, $(A_SRCS)))
OBJS    := $(filter-out notuse.o, $(C_OBJS) $(A_OBJS))
OBJS_PREFIX := $(addprefix $(OBJS_DIR)/, $(OBJS))TARGET_NAME := $(OUT_DIR)/lib_sample.lib $(OUT_DIR)/sample.dll
DLL_EXPORT_SYMBOL   := $(OUT_DIR)/sample.symbol
DLL_DEF := $(OUT_DIR)/sample.def
DLL_IMPLIB  := $(OUT_DIR)/sample.lib
DLL_PDB := $(OUT_DIR)/sample.pdb
OUT_PDB := -debug -PDB:$(DLL_PDB)CFLAGS    := $(EXTRA_CFLAGS)
CFLAGS  += -Dstrtod=avpriv_strtod -Dsnprintf=avpriv_snprintf -D_snprintf=avpriv_snprintf -Dvsnprintf=avpriv_vsnprintfRCFLAGS := $(EXTRA_RCFLAGS)ASMFLAGS := $(EXTRA_ASMFLAGS)SRCS_INC   := -I. -I$(SRCS_DIR)LIBRARY_STATIC := -out:$(filter %.lib, $(TARGET_NAME))
LIBRARY_DYNAMIC := -out $(filter %.dll, $(TARGET_NAME)).PHONY: clean all
all:$(TARGET_NAME)$(filter %.lib, $(TARGET_NAME)):$(OBJS)$(AR) $(LIBRARY_STATIC) $(OBJS_PREFIX)$(filter %.dll, $(TARGET_NAME)):$(OBJS)makedef $(DLL_EXPORT_SYMBOL) $(OBJS_PREFIX) > $(DLL_DEF)SubWCRev ./ ./dll_info.t ./dll_info.rc$(RC) $(RCFLAGS) -fo $(OBJS_DIR)/dll_info.res  ./dll_info.rc$(LD) -dll -def:$(DLL_DEF) -implib:$(DLL_IMPLIB) $(LIBRARY_DYNAMIC) $(OBJS_PREFIX) $(OBJS_DIR)/dll_info.res $(OUT_PDB)%.o:%.c$(CC) $(SRCS_INC) $(CFLAGS) -Fo $(OBJS_DIR)/$@ $<%.o:%.asm:$(ASM) $(SRCS_INC) $(ASMFLAGS) $< -o $(OBJS_DIR)/$@clean:rm -rf $(OBJS_PREFIX) $(TARGET_NAME) $(DLL_IMPLIB) $(DLL_PDB) 

3. 关于上述DLL_EXPORT_SYMBOL := $(OUT_DIR)/sample.symbol的写法

sample.symbol中的内容如:

LIBSAMPLE {global: SAMPLE_*local:*;
};

 (1)、使用MinGW中自带的makedef工具,外加命令**makedef $(DLL_EXPORT_SYMBOL) $(OBJS_PREFIX) > $(DLL_DEF)**便可导出库中的符号,即动态库的引导库;
 (2)、global SAMPLE_* 表示所有以SAMPLE_开头的函数符号都会导出即外部可见。

4、Makefile_demo的编写

include config.mkDEMO_SRC_DIR = ../../demovpath %.c $(DEMO_SRC_DIR)
vpath %.h $(DEMO_SRC_DIR)DEMO_SRCS := $(wildcard $(DEMO_SRC_DIR )/*c)DEMO_OBJS := $(subst .c,.o, $(DEMO_SRCS))DEMO_INC := $(DEMO_SRC_DIR)DEMO_CFLAGS := $(EXTRA_CFLAGS)
DEMO_CFLAGS += -I $(DEMO_INC ) LIB_NAME := $(OUT_DIR)/libxxx.lib
DEMO_LDFLAGS := -libpath:$(LIB_NAME)TARGET_DEMO= $(OUT_DIR)/xxx.exe.PHONY: clean all
all: clean $(LIB_NAME) $(TARGET_DEMO)$(TARGET_DEMO):$(DEMO_OBJS)$(LD) $(DEMO_LDFLAGS) -PDB:$(OUT_DIR)/demo.pdb -debug -out $@ $< $(LIB_NAME) %.o:%.c:$(CC) $(DEMO_CFLAGS) -c -Fo $@ $<$(LIB_NAME):make -C ../lib -f Makfile_libclean:rm -rf $(DEMO_OBJS) $(TARGET_DEMO) make -C ./ -f Makfile_lib clean

【开发工具】之MinGW下makefile的编写相关推荐

  1. python学习自记录(2)开发工具的pycharm安装使用,编写的第一个应声虫程序

    python学习自记录(2)开发工具的pycharm安装使用 1.下载安装 链接:https://pan.baidu.com/s/18ARXYybcoMrRi96gfIh6Zg 密码:qydc 下方注 ...

  2. 苹果电脑php开发工具,Mac系统下给力的PHP开发工具

    俗话说,磨刀不误砍柴工.说的就是,一个给力的工具,可以大大提高工作的效率. 在MAC系统中,PHP开发用什么工具好呢? 我在对比了网上水友们提供的几个工具后,挑选了两款用了一个多月,发现还是不错的. ...

  3. HTML之网页开发 (二):第一个网页、认识HTML、开发工具、HTML元素、注释编写

    跳转目录

  4. 安装Ubuntu下的开发工具

    安装Ubuntu下的开发工具 安装Ubuntu下的开发工具 刚安装好的Ubuntu,还缺乏很多开发工具.这些工具都可以通过网络进行安装.如果网络不佳,也可以使用光盘中的工具包. 如果要使用光盘中的工具 ...

  5. linux--多目录下的MakeFile文件(嵌套Makefile)编写

    linux--多目录下的makefile文件(嵌套Makefile)编写 1 简介 2 规则 2.1 简介 2.1.1 Makefile 主要的 5个部分 (显示规则, 隐晦规则, 变量定义, 文件指 ...

  6. 十四种Java开发工具点评

    图形界面的java开发工具 JDK Borland 的JBuilder ,JDeveloper,VisualAge for Java jcreater. 常见的十五种Java开发工具的特点 1.JDK ...

  7. perl开发工具大全

    ActivePerl 一个可以让你任意执行 Perl 程序的工具软件,其包含了包括有 Perl for Win32.Perl for ISAPI.PerlScript.Perl Package Man ...

  8. java 编程工具_Java开发工具可以促进编程!

    java 编程工具 Java开发人员通常尝试找到快速有效地编写高质量Java代码的方法,以使他们的编程工作变得更轻松. 由于情况发生了变化,因此出现了越来越多的工具. 因此,下面列出了大多数开发人员已 ...

  9. Java开发工具可以促进编程!

    Java开发人员通常尝试找到快速有效地编写高质量Java代码的方法,以使他们的编程工作更轻松. 由于情况发生了变化,因此出现了越来越多的工具. 因此,下面列出了大多数开发人员已经使用,将来使用或一定会 ...

最新文章

  1. 论文笔记 | CNN 是怎么学到图片绝对位置信息的
  2. MySQL基础篇:单行函数
  3. html 列表bootstrap,bootstrap都有哪些类?
  4. Elasticsearch集群Red,分片无法恢复:cannot allocatebecause all found copies of the shard are either stale or c
  5. mysql自动写入创建时间_mysql 自动记录数据插入及最后修改时间
  6. escape mysql_mysql_escape_string()函数用法分析
  7. Redis在windows下的配置
  8. android 管理类,android 线程管理类
  9. 【新春特辑】发压岁钱、看贺岁片、AI写春联……华为云社区给大家拜年了
  10. Makefile:GCC CFLAGS变量和LDFLAGS变量
  11. 【数学建模】关联与因果问题
  12. MTK 开机logo 修改
  13. .net反混淆脱壳工具de4dot的使用
  14. emoji语言抽象话大全_当抽象话也成为一种暗语
  15. 【Redis】模拟手机验证码案例:Jedis使用、get、hget、hincrBy、setex、生成6位随机数工具
  16. 学会jQuery 不用买书
  17. JFugue4.0 中文说明
  18. CentOS 7重启网卡出现RTNETLINK answers:File exists
  19. 高性能web 架构之 mysql 读写分离
  20. Windows64Adobe2019/2019全家桶

热门文章

  1. .net 延时操作_锁、CAS操作和无锁队列的实现
  2. Rails UVA - 514(栈)
  3. MultipartFile与File之间的相互转换
  4. Apache Bench
  5. redis list放入对象_Redis从入门到入土:详细讲解内存模型以及常用命令
  6. (转载)js对象原来也有类、实例属性和原型属性
  7. servlet ---- servlet入门
  8. html toast屏幕中间,Toast.html
  9. mysql pxc启动_Percona XtraDB Cluster(PXC) 无法正常启动
  10. vue2.0桌面端框架_Vue PC端框架