序
本文旨在示例怎么编写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