【开发工具】之MinGW下makefile的编写
序
前文《【开发工具】之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的编写相关推荐
- python学习自记录(2)开发工具的pycharm安装使用,编写的第一个应声虫程序
python学习自记录(2)开发工具的pycharm安装使用 1.下载安装 链接:https://pan.baidu.com/s/18ARXYybcoMrRi96gfIh6Zg 密码:qydc 下方注 ...
- 苹果电脑php开发工具,Mac系统下给力的PHP开发工具
俗话说,磨刀不误砍柴工.说的就是,一个给力的工具,可以大大提高工作的效率. 在MAC系统中,PHP开发用什么工具好呢? 我在对比了网上水友们提供的几个工具后,挑选了两款用了一个多月,发现还是不错的. ...
- HTML之网页开发 (二):第一个网页、认识HTML、开发工具、HTML元素、注释编写
跳转目录
- 安装Ubuntu下的开发工具
安装Ubuntu下的开发工具 安装Ubuntu下的开发工具 刚安装好的Ubuntu,还缺乏很多开发工具.这些工具都可以通过网络进行安装.如果网络不佳,也可以使用光盘中的工具包. 如果要使用光盘中的工具 ...
- linux--多目录下的MakeFile文件(嵌套Makefile)编写
linux--多目录下的makefile文件(嵌套Makefile)编写 1 简介 2 规则 2.1 简介 2.1.1 Makefile 主要的 5个部分 (显示规则, 隐晦规则, 变量定义, 文件指 ...
- 十四种Java开发工具点评
图形界面的java开发工具 JDK Borland 的JBuilder ,JDeveloper,VisualAge for Java jcreater. 常见的十五种Java开发工具的特点 1.JDK ...
- perl开发工具大全
ActivePerl 一个可以让你任意执行 Perl 程序的工具软件,其包含了包括有 Perl for Win32.Perl for ISAPI.PerlScript.Perl Package Man ...
- java 编程工具_Java开发工具可以促进编程!
java 编程工具 Java开发人员通常尝试找到快速有效地编写高质量Java代码的方法,以使他们的编程工作变得更轻松. 由于情况发生了变化,因此出现了越来越多的工具. 因此,下面列出了大多数开发人员已 ...
- Java开发工具可以促进编程!
Java开发人员通常尝试找到快速有效地编写高质量Java代码的方法,以使他们的编程工作更轻松. 由于情况发生了变化,因此出现了越来越多的工具. 因此,下面列出了大多数开发人员已经使用,将来使用或一定会 ...
最新文章
- 论文笔记 | CNN 是怎么学到图片绝对位置信息的
- MySQL基础篇:单行函数
- html 列表bootstrap,bootstrap都有哪些类?
- Elasticsearch集群Red,分片无法恢复:cannot allocatebecause all found copies of the shard are either stale or c
- mysql自动写入创建时间_mysql 自动记录数据插入及最后修改时间
- escape mysql_mysql_escape_string()函数用法分析
- Redis在windows下的配置
- android 管理类,android 线程管理类
- 【新春特辑】发压岁钱、看贺岁片、AI写春联……华为云社区给大家拜年了
- Makefile:GCC CFLAGS变量和LDFLAGS变量
- 【数学建模】关联与因果问题
- MTK 开机logo 修改
- .net反混淆脱壳工具de4dot的使用
- emoji语言抽象话大全_当抽象话也成为一种暗语
- 【Redis】模拟手机验证码案例:Jedis使用、get、hget、hincrBy、setex、生成6位随机数工具
- 学会jQuery 不用买书
- JFugue4.0 中文说明
- CentOS 7重启网卡出现RTNETLINK answers:File exists
- 高性能web 架构之 mysql 读写分离
- Windows64Adobe2019/2019全家桶
热门文章
- .net 延时操作_锁、CAS操作和无锁队列的实现
- Rails UVA - 514(栈)
- MultipartFile与File之间的相互转换
- Apache Bench
- redis list放入对象_Redis从入门到入土:详细讲解内存模型以及常用命令
- (转载)js对象原来也有类、实例属性和原型属性
- servlet ---- servlet入门
- html toast屏幕中间,Toast.html
- mysql pxc启动_Percona XtraDB Cluster(PXC) 无法正常启动
- vue2.0桌面端框架_Vue PC端框架