1

makefile を使用してアプリと .out ファイルを作成し、verifone vx520 で使用したいと考えています。.out ファイルを作成するための makeapp.bat がありますが、実行すると次のエラーが発生します:NMAKE : fatal error U1073: don't know how to make 'utils.h' これは makeapp.bat ファイルです:

@goto Begin 
:Begin
@set OLDPATH=%PATH%
@rem set VRXSDKS to the Verix V SDK directory 
@set VRXSDK=C:\eVoAps\SDK\1.2.0\VRXSDK
@rem Set RVCTDIR to RVDS2.2
@set RVCTDIR=C:\Program Files\ARM\RVCT\Programs\2.2\349\win_32-pentium
@rem or, Set RVCTDIR to RVDS2.1
@rem set RVCTDIR=C:\Program Files\ARM\RVCT\Programs\2.0.1\277\win_32-pentium
@set PATH=%VRXSDK%\bin\;%RVCTDIR%;%OLDPATH%
@rem use app.mak to buid application
nmake /f app.mak 
@rem or, use vrxcc directly here to build a simple application
@rem %VRXSDK%\bin\vrxcc app.c
@set PATH=%OLDPATH%
@set RVCTDIR=

pause

どうすればそのエラーを解決できますか?

4

1 に答える 1

4

したがって、ここのbatファイルには多くのコメント(@rem)があり、いくつかの変数(@set)も設定されているように見えますが、作業の大部分は行で行われます

nmake /f app.mak 

という別のファイルを参照しますapp.maknmakeここで魔法が起こり、コンパイルとリンクの方法を知るために何かを編集する必要がありますutils.h詳細については、 c2.com/cgi/wiki?UsingNmakeをご覧になることをお勧めします。

ご存知のように、make ファイルは、あらゆる意味で、ユーザーが作成するプログラムです。実行すると、VeriFone アプリ (または、作業中のその他のプログラム) がビルドされます。このように、実行できることは多数ありますが、nmake で実際にプログラムをビルドするには、実行しなければならないことがいくつかあります。私のmakeファイルの一部を共有するのが最善の方法だと思います。これは、サンプルの VeriFone プロジェクトの単なるテンプレートとして開始されたことに注意してください。

私の場合は、次のように、変数、パスなどを宣言するだけから始めます。

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

TerminalTypeこれは、Visual Studio がビルドを開始するときに NMAKE に渡すように設定したものであり、ソリューション構成に基づいていることに注意してください。技術的には、別の make ファイルを呼び出す 1 つの make ファイルがあり、外側のファイルは次のように設定していますTerminalType=$(Configuration)。この変数と同様の他のいくつかの変数を以下に示します。

次に、いくつかのコンパイラ オプションを定義します。

#  Switch based on terminal type
!IF "$(TerminalType)"=="eVo"
CompilerCompatibility=-p
DefineTerminalType = -DEVO_TERMINAL
!ELSE
CompilerCompatibility=
DefineTerminalType = -DVX_TERMINAL
!ENDIF

フラグは、-Dあたかも#define. これは、コンパイル対象に応じてパーツをオンまたはオフにするのに役立ちます。そうするつもりがない限り、自分でやる必要はありません。eVo 端末用にコンパイルする人にとってここで重要な部分は、フラグCompilerCompatibilityを設定する部分です-p(Verix V ではオフにする必要があり、eVo 端末ではオンにする必要があります)。

これまでに行ったすべてのことを 2 つの変数に統合します。

Includes    = -I$(AppIncludes) $(SDKIncludes) $(ACTIncludes) $(VMACIncludes) $(VCSIncludes)
COptions    =$(CompilerCompatibility) $(DefineTerminalType) 

OK、ここであなたがつまずいていると思われる部分です: 依存関係を定義する必要があります。

# Dependencies
AppObjects = \
        $(ObjDir)\$(ProjectName).o \
        $(ObjDir)\Base.o \
        $(ObjDir)\UI.o \
        $(ObjDir)\Comm.o

Libs =      $(ACTLibraries)\act2000.a

必要に応じて、これをすべて 1 行にまとめることができます。各行の\最後にある は、読みやすくするためにここで行っている単一の行を分割していることを意味します。それ以外の場合は、次のようになります。

AppObjects = $(ObjDir)\$(ProjectName).o $(ObjDir)\Base.o $(ObjDir)\UI.o $(ObjDir)\Comm.o

Libs = $(ACTLibraries)\act2000.a

OK、これAppObjectsはリンクを行うときに使用されます。ただし、最初に、ファイル署名プログラムを実行し、必要な場所にファイルをコピーするように NMAKE に指示することも必要です。

#  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 *****************************************************************

次に、リンクを行う方法を定義しましょう。

#  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

これで、実際にコンパイルを実行できます。

#  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が、それはメイク ファイルの最後のステップです。次に、リンクの仕方を人に教えますが、それは最後から 2 番目のステップです。

さらに詳しい情報が必要な場合は、私が含めたリンクにアクセスしてください。これは私よりもはるかに権威があり、おそらく見逃していた多くの詳細が含まれています。ただし、うまくいけば、これで十分です。

于 2016-10-24T23:45:54.800 に答える