【开发工具】之windows下gnu makefile编写

本文详细介绍如何在Windows环境下使用GnuWin32组件编写Makefile,包括安装配置步骤、编写config_win.mk和Makefile_win的具体方法,以及相关资源文件的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 本文旨在示例怎么编写windows下的makefile, 依赖于"GnuWin32",可自行网上下载。

安装方法一:

下载网址:http://gnuwin32.sourceforge.net/packages/make.htm
其他组件包:http://gnuwin32.sourceforge.net/packages.html
具体安装可参考:https://stackoverflow.com/questions/2532234/how-to-run-a-makefile-in-windows

安装方法二:

下载网址:https://sourceforge.net/projects/getgnuwin32/files/
1、安装下载好的可执行文件
2、在安装目录,新建download_config.bat,内容如:

:start


set WGET=bin\wget-1.12.exe -nc --no-check-certificate -t2

%WGET% http://downloads.sourceforge.net/project/gnuwin32/make/3.81/make-3.81-bin.zip 
%WGET% http://downloads.sourceforge.net/project/gnuwin32/make/3.81/make-3.81-dep.zip
%WGET% http://www.aspisys.com/lua53.exe
%WGET% https://www.irontcl.com/downloads/irontcl-amd64-8.6.7.zip
%WGET% https://github.com/premake/premake-core/releases/download/v5.0.0-alpha12/premake-5.0.0-alpha12-windows.zip -Opremake-5.0.0-alpha12-windows.zip
rem %WGET% https://cmake.org/files/v3.5/cmake-3.5.2-win32-x86.zip
rem %WGET% http://downloads.sourceforge.net/project/pkgconfiglite/0.28-1/pkg-config-lite-0.28-1_bin-win32.zip
rem %WGET% http://downloads.sourceforge.net/project/pkgconfiglite/0.28-1/pkg-config-lite-0.28-1_bin-win32.zip

%WGET% http://sourceforge.net/projects/gnuwin32/files/coreutils/5.3.0/coreutils-5.3.0-bin.zip
%WGET% http://sourceforge.net/projects/gnuwin32/files/coreutils/5.3.0/coreutils-5.3.0-dep.zip
%WGET% http://downloads.sourceforge.net/project/gnuwin32/diffutils/2.8.7-1/diffutils-2.8.7-1-bin.zip
%WGET% http://downloads.sourceforge.net/project/gnuwin32/diffutils/2.8.7-1/diffutils-2.8.7-1-dep.zip
%WGET% https://sourceforge.net/projects/gnuwin32/files/findutils/4.2.20-2/findutils-4.2.20-2-bin.zip
%WGET% http://downloads.sourceforge.net/project/gnuwin32/findutils/4.2.20-2/findutils-4.2.20-2-bin.zip
%WGET% http://downloads.sourceforge.net/project/gnuwin32/findutils/4.2.20-2/findutils-4.2.20-2-dep.zip
%WGET% http://downloads.sourceforge.net/project/gnuwin32/grep/2.5.4/grep-2.5.4-bin.zip
%WGET% http://downloads.sourceforge.net/project/gnuwin32/grep/2.5.4/grep-2.5.4-dep.zip
rem %WGET% http://downloads.sourceforge.net/project/gnuwin32/wget/1.11.4-1/wget-1.11.4-1-bin.zip
rem %WGET% http://downloads.sourceforge.net/project/gnuwin32/wget/1.11.4-1/wget-1.11.4-1-dep.zip
%WGET% https://eternallybored.org/misc/wget/releases/wget-1.19.4-win64.zip
%WGET% https://sourceforge.net/projects/gnuwin32/files/libiconv/1.9.2-1/libiconv-1.9.2-1-bin.zip
%WGET% https://downloads.sourceforge.net/project/gnuwin32/sed/4.2.1/sed-4.2.1-bin.zip
%WGET% https://github.com/elisherer/cecho/archive/master.zip
%WGET% https://tartarus.org/~simon/putty-snapshots/w64/putty.zip
%WGET% http://www.codeproject.com/KB/applications/SetEnv/SetEnv_exe.zip
rem @set WGET=%WGET% https://winscp.net/download/WinSCP-5.9.4-Portable.zip
rem @set WGET=%WGET%  http://www.module.ru/mb7707/soft/libxslt-1.1.26.win32.zip %bypass_rcm_proxy% 

%WGET% http://downloads.sourceforge.net/project/gnuwin32/tar/1.13-1/tar-1.13-1-bin.zip
%WGET% http://downloads.sourceforge.net/project/gnuwin32/tar/1.13-1/tar-1.13-1-dep.zip
%WGET% http://downloads.sourceforge.net/project/gnuwin32/gzip/1.3.12-1/gzip-1.3.12-1-bin.zip
%WGET% http://downloads.sourceforge.net/project/gnuwin32/unzip/5.51-1/unzip-5.51-1-bin.zip
%WGET% http://www.7-zip.org/a/7za920.zip

3、在安装目录,新建install_config.bat,内容如:

@set GNUWIN32_INSTALL_DIRECTORY=%1
@if "%GNUWIN32_INSTALL_DIRECTORY%"=="" set GNUWIN32_INSTALL_DIRECTORY=%cd%
bin\unzip -u -o -q -d %GNUWIN32_INSTALL_DIRECTORY% coreutils-5.3.0-bin.zip
bin\unzip -u -o -q -d %GNUWIN32_INSTALL_DIRECTORY% coreutils-5.3.0-dep.zip
bin\unzip -u -o -q -d %GNUWIN32_INSTALL_DIRECTORY% diffutils-2.8.7-1-bin.zip
bin\unzip -u -o -q -d %GNUWIN32_INSTALL_DIRECTORY% diffutils-2.8.7-1-dep.zip
bin\unzip -u -o -q -d %GNUWIN32_INSTALL_DIRECTORY% findutils-4.2.20-2-bin.zip
bin\unzip -u -o -q -d %GNUWIN32_INSTALL_DIRECTORY% findutils-4.2.20-2-bin.zip
bin\unzip -u -o -q -d %GNUWIN32_INSTALL_DIRECTORY% findutils-4.2.20-2-dep.zip
bin\unzip -u -o -q -d %GNUWIN32_INSTALL_DIRECTORY% grep-2.5.4-bin.zip
bin\unzip -u -o -q -d %GNUWIN32_INSTALL_DIRECTORY% grep-2.5.4-dep.zip
bin\unzip -u -o -q -d %GNUWIN32_INSTALL_DIRECTORY% make-3.81-bin.zip 
bin\unzip -u -o -q -d %GNUWIN32_INSTALL_DIRECTORY% make-3.81-dep.zip
rem bin\unzip -u -o -q -d %GNUWIN32_INSTALL_DIRECTORY% wget-1.11.4-1-bin.zip
rem bin\unzip -u -o -q -d %GNUWIN32_INSTALL_DIRECTORY% wget-1.11.4-1-dep.zip
bin\unzip -u -o -q -d %GNUWIN32_INSTALL_DIRECTORY%\bin wget-1.19.4-win64.zip
bin\unzip -u -o -q -d %GNUWIN32_INSTALL_DIRECTORY% tar-1.13-1-bin.zip
bin\unzip -u -o -q -d %GNUWIN32_INSTALL_DIRECTORY% tar-1.13-1-dep.zip
bin\unzip -u -o -q -d %GNUWIN32_INSTALL_DIRECTORY% gzip-1.3.12-1-bin.zip
bin\unzip -u -o -q -d %GNUWIN32_INSTALL_DIRECTORY% unzip-5.51-1-bin.zip
bin\unzip -u -o -q -d %GNUWIN32_INSTALL_DIRECTORY% libiconv-1.9.2-1-bin.zip
bin\unzip -u -o -q -d %GNUWIN32_INSTALL_DIRECTORY% sed-4.2.1-bin.zip
bin\unzip -u -o -q -d %GNUWIN32_INSTALL_DIRECTORY%\bin 7za920.zip 
bin\unzip -u -o -q -d %GNUWIN32_INSTALL_DIRECTORY%\bin putty.zip 
bin\unzip -u -o -q -d %GNUWIN32_INSTALL_DIRECTORY%\bin premake-5.0.0-alpha12-windows.zip
bin\unzip -u -o -q -d %GNUWIN32_INSTALL_DIRECTORY% irontcl-amd64-8.6.7.zip
bin\unzip -p master.zip cecho-master\cecho\bin\Release\cecho.exe  > %GNUWIN32_INSTALL_DIRECTORY%\bin\cecho.exe

4、点击download_config.bat,等包下载完后,在点击install_config.bat。

1、编写config_win.mk

 小编习惯于将编译flag统一放到一个文件中,因此新建config_win.mk,内容如:

ifeq ($(strip $(platform)), x86_32)
	CC	:= cl.exe
	LD	:= link.exe
	AR	:= lib.exe
	RC	:= rc.exe
	
	EXTRA_CFLAGS := -W3 -nologo -DWIN32
	EXTRA_CFLAGS += -D_CRT_SECURE_NO_WARNINGS -O2
	EXTRA_LDFLAGS :=
	EXTRA_RCFLAGS := -DWIN32
endif

ifeq ($(strip $(platform)), x86_64)
	CC	:= cl.exe
	LD	:= link.exe
	AR	:= lib.exe
	RC	:= rc.exe
	
	EXTRA_CFLAGS := -W3 -nologo -DWIN64
	EXTRA_CFLAGS += -D_CRT_SECURE_NO_WARNINGS -O2
	EXTRA_LDFLAGS :=
	EXTRA_RCFLAGS := -DWIN64
endif

CFLAGS := $(EXTRA_CFLAGS)
LDFLAGS := $(EXTRA_LDFLAGS)
RCFLAGS := $(EXTRA_RCFLAGS)
ARFLAGS :=	 
2、编写makfile_win

 小编为了和linux下的makefile区分,因此新建了一个名为Makefile_win的文件,内容如:

###windows gnu make
### 假设库的目录结构如下且同一“-”长度的属于同一目录
###  -3rdparty    	 #第三方库相关的库文件
###  -src		  	    #源码路径(包含C文件及头文件)
###  -build		 	 #build目录下有各平台相关的文件夹
###  --windows	 	 #windows文件夹
###  ---makefile 	 #windows下的makefile
###  ---dll_info.rc	 #资源文件
###  --objs		  	 #obj文件输出目录
###  --out		  	 #库输出目录

include config_win.mk

##库的名字在此设置
LIB_NAME := xxx

##指定相关路径关系
ROOT_DIR := ../..
C_SRCS_DIR := $(ROOT_DIR)/src
INCS_DIR := $(ROOT_DIR)/src
OBJS_DIR := $(ROOT_DIR)/build/objs

INC_FLAGS := -I$(ROOT_DIR)/src \
			 -I$(ROOT_DIR)/3rdparty

#设置动态库静态库生成路径
TARGET_S := $(ROOT_DIR)/build/out/lib_$(LIB_NAME).lib 	#静态库
TARGET_D := $(ROOT_DIR)/build/out/$(LIB_NAME).dll		#动态库
DLL_IMPLIB := $(ROOT_DIR)/build/out/$(LIB_NAME).lib		#动态库导入库
DLL_LIBPDB := $(ROOT_DIR)/build/out/$(LIB_NAME).pdb		#动态库的PDB文件

#设置资源文件路径
RC_SRCS := $(ROOT_DIR)/build/windows/dll_info.rc

#设置相关源文件
C_SRCS := $(C_SRCS_DIR)/main.c

#设置编译过程输出日志
OUTPUT = 
##OUTPUT = >>compile.log 2>&1

##目标文件
OBJS := $(patsubst %.s, %.obj, $(patsubst %.c, %.obj, $(patsubst %.cpp, %.obj, $(C_SRCS))))
OBJS_PATH := $(addprefix $(OBJS_DIR)/, $(notdir $(OBJS)))

##资源文件
OBJRES := $(patsubst %.rc, %.res, $(RC_SRCS))
OBJRES_PATH := $(addprefix $(OBJS_DIR)/, $(notdir $(OBJRES)))

all: $(TARGET_S) $(TARGET_D)

#静态库
$(TARGET_S):$(OBJS)
	echo $(OBJS)
	$(AR) $(ARFLAGS) -out:$@ $(OBJS_PATH) $(OUTPUT)  

#动态库
$(TARGET_D):$(OBJS)
	$(LD) $(LDFLAGS) -dll -implib:$(DLL_IMPLIB) -out:$@ $(OBJS_PATH) $(OBJRES_PATH) -debug -PDB:$(DLL_LIBPDB)
	
	
%.obj:%.c
	$(CC) $(CFLAGS) $(INC_FLAGS) -Fo$(addprefix $(OBJS_DIR)/, $(@F)) -c $^
	
%.obj:%.cpp
	$(CPP) $(CFLAGS) $(INC_FLAGS) -Fo$(addprefix $(OBJS_DIR)/, $(@F)) -c $^
		
%.res:%.rc
	###SubWCRev.exe ../ ../dll_info.t ../dll_info.rc
	$(RC) $(RCFLAGS) -Fo $(addprefix $(OBJS_PATH)/, $(@F)) $^
	
clean:
#where -F -R . *.obj *.log | grep -e .obj -e .log | xargs rm -rf
	rm -f $(OBJRES_PATH)
	rm -f $(OBJS_PATH)

参考网址:https://cognitivewaves.wordpress.com/makefiles-windows/
参考网址:https://stackoverflow.com/questions/2532234/how-to-run-a-makefile-in-windows
参考网址:https://opensourceforu.com/2012/06/gnu-make-in-detail-for-beginners/

附录A

A1 通过vs安装目录下的Nmake编写makefile规则

参考网址:https://bbs.csdn.net/topics/320031371
参考网址:https://www.cnblogs.com/kekec/archive/2013/04/21/3007277.html
参考网址:https://blog.csdn.net/tsaiyong_ahnselina/article/details/17554337
参考网址:https://docs.microsoft.com/en-us/cpp/build/reference/compiler-options-listed-by-category?view=vs-2017

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值