【PE&Tools】GnuWin32使用以及windows下gnu makefile編寫

Date: 2018.6.22


1、GnuWin32下載地址

https://sourceforge.net/projects/getgnuwin32/files/latest/download

http://gnuwin32.sourceforge.net/

2、GnuWin32官方說明及使用方法
2.1、說明

The GnuWin project provides Win32-versions of GNU tools, or tools with a similar open source licence. The ports are native ports, that is they rely only on libraries provided with any standard 32-bits MS-Windows operating system, such as MS-Windows 95 / 98 / ME / NT / 2000 / XP / 2003 / Vista. Unlike CygWin or Msys, native ports do not rely on some kind of Unix emulation, so that there is no need to install additional emulation libraries. At present, all developments have been done under MS-Windows-XP, using the Mingw port of the GNU C and C++ (GCC) compilers. Utilities and libraries provided by GnuWin, are used and distributed with packages such as GNU Emacs and KDE-Windows.

2.2、安裝和使用方法

下載網址: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://www.cnblogs.com/April-Chou-HelloWorld/p/7636300.html

3、windows下gnu makefile自動化編譯

方法一: 採用GnuWin32提供的工具(https://sourceforge.net/projects/gnuwin32/files/make),解析makefile
或者直接將MinGW中的make.exe拷貝到腳本所在目錄下,運行腳本即可。
參考自:https://blog.csdn.net/listener51/article/details/84933876

3.1、編寫config_win.mk

存放相關係統宏和編譯flags:

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 :=	
3.2、編寫makefile_win.mk
###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)/objs

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

#設置動態庫靜態庫生成路徑
TARGET_S := $(ROOT_DIR)/out/lib_$(LIB_NAME).lib #靜態庫
TARGET_D := $(ROOT_DIR)/out/$(LIB_NAME).dll		#動態庫
DLL_IMPLIB := $(ROOT_DIR)/out/$(LIB_NAME).lib	#動態庫導入庫
DLL_LIBPDB := $(ROOT_DIR)/out/$(LIB_NAME).pdb	#動態庫的PDB文件

#設置資源文件路徑
RC_SRCS := $(ROOT_DIR)/build/windows/dll_info.rc

#設置相關源文件
C_SRCS := $(C_SRCS_DIR)/xxx.c

#設置編譯過程輸出日誌
OUTPUT = >>compile.log 2>&1

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

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

all: clean $(TARGET_S) $(TARGET_D)

#靜態庫
$(TARGET_S):$(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 $(OBJ_DIR)/, $(@F)) -c $^
	
%.obj:%.cpp
	$(CPP) $(CFLAGS) $(INC_FLAGS) -Fo$(addprefix $(OBJ_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)

方法二:
在MinGW環境下進行Windows 平臺GNU makefile的編寫

3.3、參考

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


THE END !

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章