だから、それはここにあなたのbatファイルのように私には見えたコメントの多く(@rem)があり、それはまた、いくつかの変数(@set)を設定しますが、作業の大部分はラインで行われます
nmake /f app.mak
app.mak
という別のファイルを参照します。ここで魔法が起こり、nmake
にコンパイルとリンクの方法を知らせるために何かを編集する必要があります。utils.h
。詳細はc2.com/cgi/wiki?UsingNmakeをご覧ください。
あなたが知っているように、makeファイルは、すべての目的と目的のために、あなたが書いたプログラムです。それが実行されると、VeriFoneアプリケーション(またはあなたが取り組んでいる他のプログラム)をビルドします。このように、あなたができることはたくさんありますが、nmakeが実際にプログラムをビルドしたい場合は、そのうちのいくつかを行う必要があります。私が助ける最善の方法は、私のmakeファイルの部分を共有することだと思います。これは、サンプルのVeriFoneプロジェクトから単なるテンプレートとして開始されたことに注意してください。
鉱山はちょうどそうような変数、パスなど、宣言から始まり:TerminalType
は、私はそれがビルドを開始したときにNMAKEに渡すためのVisual Studioを設定しているものですし、それが基づいている
ProjectName = TestProject
# ****** PATHS ******
# Includes
SDKIncludes = -I$(EVOSDK)\include
ACTIncludes = -I$(EVOACT)include
VCSIncludes = -I$(EVOVCS)include
#Libraries
ACTLibraries = $(EVOACT)OutPut\RV\Files\Static\Release
# App Paths
AppIncludes = .\include
SrcDir = .\source
ObjDir = .\obj
OutDir = .\Output\$(TerminalType)\$(VMACMode)\Files
ResDir = .\Resource
注意を私のソリューション構成。技術的には、私は1つのファイルを別のものに呼び出し、外側には次のように設定しています:TerminalType=$(Configuration)
。あなたはこの変数をもう一度同様に表示し、同様の他のいくつかの変数を表示します。
次に、私は#define
を行っていたかのように
# Switch based on terminal type
!IF "$(TerminalType)"=="eVo"
CompilerCompatibility=-p
DefineTerminalType = -DEVO_TERMINAL
!ELSE
CompilerCompatibility=
DefineTerminalType = -DVX_TERMINAL
!ENDIF
-D
フラグが私のコードで物事を定義するいくつかのコンパイラオプションを定義します。これは、私がコンパイルしているものに応じて部品をオンまたはオフにするのに便利です。それをやろうとしない限り、あなたはそれを自分で行う必要はありません。 eVo端末向けにコンパイルする人にとって重要なのは、-p
フラグを設定するCompilerCompatibility
です(eVo端末では、Verix Vではオフにする必要があります)。
今、私たちは2つの変数にこれまで行ってきたすべてを統合:我々は我々の依存関係を定義する必要があり、私は好きですかどの:今ここで私はあなたが上にトリップしている疑いがある部分だ、
Includes = -I$(AppIncludes) $(SDKIncludes) $(ACTIncludes) $(VMACIncludes) $(VCSIncludes)
COptions =$(CompilerCompatibility) $(DefineTerminalType)
OKをso:
私たちが望むなら、これはすべて1行になる可能性があります。各行の末尾にある\
は、読みやすさのためにここで行われている単一の行を壊すことを意味しています。そうでなければ、それは次のようになります。
AppObjects = $(ObjDir)\$(ProjectName).o $(ObjDir)\Base.o $(ObjDir)\UI.o $(ObjDir)\Comm.o
Libs = $(ACTLibraries)\act2000.a
OK我々はリンクを行うときに、ので、このAppObjects
が使用されます。しかし、最初に、NMAKEにファイル署名プログラムを実行し、ファイルをコピーしたい場所にコピーするように伝えたい。
# Link object files
$(OutDir)\$(ProjectName).out : $(AppObjects)
$(EVOSDK)\bin\vrxcc $(COptions) $(AppObjects) $(Libs) -o $(OutDir)\$(ProjectName).out
...と.RESファイルをビルド...
#This will actually build the .res file. (We only said we were going to do it above)
!if "$(VMACMode)"=="Multi"
# compile resource file
$(ResDir)\$(ProjectName).res : $(ResDir)\$(ProjectName).rck
# SET INCLUDE=$(INCLUDE);$(EVOVMAC)\include;$(EVOVMAC)\template --> I put this into my include path for the project, instead
$(EVOTOOLS)rck2 -S$(ResDir)\$(ProjectName) -O$(ResDir)\$(ProjectName) -M
!endif
、今、私たちは、実際に実行することができます。
# Sign the file(s). Tell nMake that we also
# will be creating the resource file and compiling the actual code...
# NOTE: (the indentations seen below are required for nMake to work properly)
# pseudoOut depends on TestProject.res and TestProject.out.
# If TestProject.res or TestProject.out have changed more recently than pseudoOut,
# then run commands vrxhdr..., filesignature..., and move...
!if "$(VMACMode)"=="Multi"
pseudoOut : $(ResDir)\$(ProjectName).res $(OutDir)\$(ProjectName).out
!else
pseudoOut : $(OutDir)\$(ProjectName).out
!endif
# This calls vrxhdr: the utility program that fixes the executable program’s header required to load and run the program.
# Vrxhdr is needed when you want to move a shared library around on the terminal.
$(EVOSDK)\bin\vrxhdr -s 15000 -h 5000 $(OutDir)\$(ProjectName).out
# do the signing using the file signature tool and the .fst file associated with this TerminalType.
"$(VSFSTOOL)\filesignature" $(TerminalType)$(VMACMode).fst -nogui
@echo __________________ move files to out directory __________________
# rename the .p7s file we just created
move $(OutDir)\$(ProjectName).out.p7s $(OutDir)\$(ProjectName).p7s
!if "$(VMACMode)"=="Multi"
copy $(ResDir)\imm.ini $(OutDir)\imm.ini
copy $(ResDir)\$(ProjectName).INS $(OutDir)\$(ProjectName).INS
copy $(ResDir)\$(ProjectName).res $(OutDir)\$(ProjectName).res
!endif
@echo *****************************************************************
今の私たちは、リンクを行いますどのように定義してみましょうコンパイル:
# Compile modules --> -c = compile only, -o = output file name, -e"-" => -e redirect error output from sub-tools to... "-" to stdout. (These are all then redirected via pipe |)
# For more details, see Verix_eVo_volume 3, page 59
$(ObjDir)\$(ProjectName).o : $(SrcDir)\$(ProjectName).c
!IF !EXISTS($(OutDir))
!mkdir $(OutDir)
!ENDIF
-$(EVOSDK)\bin\vrxcc -c $(COptions) $(Includes) -o $(ObjDir)\$(ProjectName).o $(SrcDir)\$(ProjectName).c -e"-" | "$(EVOTOOLS)fmterrorARM.exe"
$(ObjDir)\Base.o : $(SrcDir)\Base.c
$(EVOSDK)\bin\vrxcc -c $(COptions) $(Includes) -o $(ObjDir)\base.o $(SrcDir)\Base.c -e"-" | "$(EVOTOOLS)fmterrorARM.exe"
$(ObjDir)\UI.o : $(SrcDir)\UI.c
$(EVOSDK)\bin\vrxcc -c $(COptions) $(Includes) -o $(ObjDir)\UI.o $(SrcDir)\UI.c -e"-" | "$(EVOTOOLS)fmterrorARM.exe"
$(ObjDir)\Comm.o : $(SrcDir)\Comm.c
$(EVOSDK)\bin\vrxcc -c $(COptions) $(Includes) -o $(ObjDir)\Comm.o $(SrcDir)\Comm.c -e"-" | "$(EVOTOOLS)fmterrorARM.exe"
これが最後の行ですあなたは他のファンファーレでもありません。
私が気づいたかもしれないことを指摘したいと思いますが、私はこれをすべて開始していたときに私を投げ捨てました。私がプロジェクトを構築する方法を人に話していたら、すべてをコンパイルする方法を最初に.o
ファイルに伝えることから始めますが、それはmakeファイルの最後のステップです。次に、私は人にリンクを行う方法を教えてくれるが、それは最後から2番目のステップである。
さらに詳しい情報が必要な場合は、私が含まれているリンクを参照してください - それは私よりも信頼できる方法であり、おそらく私が逃した多くの詳細が含まれています。しかし、これであなたを得るのに十分です。
.outファイルを作成するファイルは1つだけですか?あなたは.MAKファイルをクリックし、出力は.outファイルですか? –
nmakeが内部コマンドまたは外部コマンドとして認識されないというエラーがあります。 –
nmakeが存在するディレクトリのようなサウンドはあなたのパスにありません(私はあなたがWindowsのボックスにいると仮定しています)。私のEVOTOOLS%にあります(現在は 'C:\ eVoAps \ Tools \ 1.3.0'に解決されています)。あなたのnMakeが住んでいるディレクトリがシステムPATHの一部であることを確認してください。 – David