visual studio 2013上搭建arm交叉編譯環境(四)makefile配置及編譯過程
上篇文章已經介紹了cygwin測試工程建立和生成的方法,本文在此工程的基礎上,介紹makefile修改及編譯過程。
debug.mak是makefile的配置檔案,此檔案通過makefile中如下語句匯入到makefile中,作為makefile特定變數的定義檔案。
下面是debug.mak檔案,應該很容易理解。
#DO NOT EDIT THIS FILE MANUALLY UNLESS YOU ABSOLUTELY NEED TO
#USE VISUALGDB PROJECT PROPERTIES DIALOG INSTEAD
# BINARYDIR編譯產生的檔案及目標檔案路徑,這裡在當前檔案的
BINARYDIR := Debug
#下面是編譯器的選擇
#Toolchain
CC := D:/cygwin64/bin/gcc.exe
CXX := D:/cygwin64/bin/g++.exe
LD := $(CXX)
AR := D:/cygwin64/bin/ar.exe
OBJCOPY :=
#下面是標頭檔案包含路徑及依賴庫目錄及名稱
#Additional flags
PREPROCESSOR_MACROS := DEBUG
INCLUDE_DIRS :=
LIBRARY_DIRS :=
LIBRARY_NAMES :=
ADDITIONAL_LINKER_INPUTS
MACOS_FRAMEWORKS :=
LINUX_PACKAGES :=
#編譯引數的配置
CFLAGS := -ggdb -ffunction-sections-O0
CXXFLAGS := -ggdb -ffunction-sections-O0
ASFLAGS :=
LDFLAGS := -Wl,-gc-sections
COMMONFLAGS :=
這裡我們需要採用arm9的編譯器,因此只需把Toolchain按照如下方式修改:
#Toolchain
CC := D:/cygwin64/arm-cross/usr/bin/arm-unknown-linux-gnu-gcc.exe
CXX :=D:/cygwin64/arm-cross/usr/bin/arm-unknown-linux-gnu-g++.exe
LD := $(CXX)
AR := D:/cygwin64/arm-cross/usr/bin/arm-unknown-linux-gnu-ar.exe
此處修改完後,編譯時就會使用此處定義的編譯器進行程式碼編譯。
有關編譯引數的配置,根據自己需要在addition flag中配置,我的引數配置如下:
#Additional flags
PREPROCESSOR_MACROS := NDEBUG RELEASE
INCLUDE_DIRS := ../../../include
LIBRARY_DIRS :=
LIBRARY_NAMES :=
ADDITIONAL_LINKER_INPUTS :=
MACOS_FRAMEWORKS :=
LINUX_PACKAGES :=
APPOUTPUT_PATH := ../../../output
CFLAGS := -Wall -Wextra -ffunction-sections -O3
CXXFLAGS := -Wall -Wextra-ffunction-sections -O3
ASFLAGS :=
LDFLAGS := -Wl,-gc-sections
COMMONFLAGS :=
配置完成之後,直接build工程,即可查詢編譯結果。
Makefile檔案系統會根據debug.mak的配置及原始檔的變動自動重新生成後再執行make,所以在工程中新增和刪除原始檔,不需要修改makefile,只需要重新編譯即可。
Makefile中如下定義,是定義輸出檔案檔名稱和輸出檔案型別。
TARGETNAME := arm9projtest
#TARGETTYPE can be APP, STATIC or SHARED
TARGETTYPE := APP
APP及生成可執行二進位制檔案,生成的檔案可以直接在arm板終端下執行,如上定義最終將在Debug下生成arm9projtest。
如果原始檔需要生成動態庫.so,可按照如下配置,當然程式碼中要包含對外輸出介面。
TARGETNAME := arm9projtest.so
#TARGETTYPE can be APP, STATIC or SHARED
TARGETTYPE := SHARED
靜態庫的生成,修改makefile如下:
TARGETNAME := arm9projtest.a
#TARGETTYPE can be APP, STATIC or SHARED
TARGETTYPE := STATIC
至此arm9的開發編譯環境已經介紹完了,後面介紹下,如何快速建立工程,把以前的程式碼移植到vs上。
首先我們按照上述方式建立一個測試工程,配置好編譯環境。
然後從vs工程中刪除測試程式碼,新增我們自己的程式碼到工程中。
最後在Makefile中修改目標名稱和目標型別,重新編譯,即可生成我們自己的目標檔案。
如果開放專案比較大,有很多個工程需要建立,這裡介紹一個便捷的方式。
1,把配置好的工程資料夾複製一份,把資料夾名稱修改為新的工程名稱,例如:員工稱資料夾為arm9projtest,複製一份修改為aaa1。
2,進入aaa1,保留如下檔案其餘都刪除,這裡我用的是debug.mak,如果建立工程使用的配置為release.mak請保留release相關的檔案。
3,把檔案命中arm9projtest都改為aaa1。
4, 選擇arm9projtest.vcxproj檔案,用文字編輯器開啟,把如下內容修改一為aaa1,綠色標註的兩個地方:
5,開啟VS 工程,選擇Solution右擊->ADD->ExistingProject 選擇我們修改的工程arm9projtest.vcxproj,新增到Solution中。
刪除掉工程的原始檔,新增自己的原始檔到工程中,修改makefile目標名稱和目標型別,然後編譯即可。
下面截圖是我的整個專案工程的搭建結果:
再說下編譯依賴庫及檔案路徑的配置的地方,在debug.mak檔案中:
INCLUDE_DIRS:= ../../../include
LIBRARY_DIRS:= ../../../output
LIBRARY_NAMES:= arm9eisuv2link arm9eisuv2analysexml arm9eisuv2public
有關清理可能會報錯,清理不掉,可以在makefile中做如下修改:
clean:
#ifeq ($(USE_DEL_TO_CLEAN),1)
#del /S /Q $(BINARYDIR)
#else
rm -rf $(BINARYDIR)
#endif