1. 程式人生 > >visual studio 2013上搭建arm交叉編譯環境(四)makefile配置及編譯過程

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編譯產生的檔案及目標檔案路徑,這裡在當前檔案的

Debug目錄中

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