【问题标题】:how to crate a make file for verifone (vx520 or vx820)如何为verifone(vx520或vx820)创建makefile
【发布时间】:2018-07-10 10:28:53
【问题描述】:

我有一个验证终端(vx520 和 vx820)。 我想为这个终端编译应用程序创建一个 makefile。 我有“VRXSDK”版本 1.2.0

怎么做?

或如何编译像“main.c”或“main.cpp”这样的文件,直到有一个verifone POS终端的执行文件

【问题讨论】:

  • 欢迎使用 StackOverflow。你的问题可能有点太宽泛了。我是否可以建议您通过访问Help CenterAsking section 来提高获得有用答案的机会?

标签: makefile verifone


【解决方案1】:

无论您从哪里获得“VRXSDK”,您都应该能够获得一些示例项目文件。您会在其中找到一个 make 文件(可能带有 .smk 扩展名)。我建议您从这个开始,当您通读它时,应该会向您提出更具体的问题以及您可以使用您最喜欢的搜索引擎查找的内容。

make 文件本质上是一个程序,它使用您根据各种因素确定的输入参数调用编译器。它还将调用链接器将它们联系在一起。从一种实现方式到另一种实现方式,您的处理方式差异很大,因此“我如何创建 make 文件”与“我如何编写程序?”一样广泛。这使得在这里回答它相当具有挑战性。但是,为了让您开始...

我使用 Visual Studio 作为我的 IDE,我正在使用 NMake。我实际上有 2 层 make 文件。当我从我的 IDE 中说“构建”时,外层就是所谓的,它非常短:

# Pick one of the following (for LOG_PRINTF messages)
#CompileWithLogSys = -DLOGSYS_FLAG 
CompileWithLogSys =

all:
    $(MAKE) /i /f coreBuild.smk /a TerminalType=$(Configuration) CompileWithLogSys=$(CompileWithLogSys) VMACMode=Multi
    $(MAKE) /i /f coreBuild.smk /a TerminalType=$(Configuration) CompileWithLogSys=$(CompileWithLogSys) VMACMode=Single

以 # 开头的行是 cmets。

当我想构建不同的变体时,这个外部文件让我可以很容易地切换一些东西。你可以看到我已经关闭了 LogSys 的编译。 2 层方法给我的更重要的事情是一种简单的方法,可以用一个命令来编译 2 个不同的版本。这会在“VMACMode”设置为“Multi”的情况下运行 nmake,然后在设置为“Single”的情况下再次运行它。内部 make 文件将看到该参数并为每个编译到不同的根文件夹,所以最后我得到了 2 个文件夹,每个文件夹都有不同的版本。

您可以在“nmake 参数”上进行网络搜索,以查看 /i 和 /f 之类的功能,以及我在这里没有使用的其他选项。但是,我想将您的注意力引向TerminalType=$(Configuration)。在 Visual Studio 中,您可以从 Dropbox 中选择“调试”或“发布”。这 2 个选项是默认选项,但您可以更改它们;就我而言,我已将它们修改为“eVo”和“Vx”。现在我只需在我的下拉框中选择要编译的版本并传入。或者,我可以将两者都硬编码到我的外部 make 文件中。这只是偏好。

我的内部 make 文件(名为“coreBuild.smk”)变得更加有趣。 通常,您首先定义变量,例如“包含路径”:

# Includes
SDKIncludes = -I$(EVOSDK)\include
ACTIncludes = -I$(EVOACT)include
VCSIncludes = -I$(EVOVCS)include
EOSIncludes = -I$(EOSSDK)\include\ssl2

和/或库:

#Libraries
ACTLibraries    = $(EVOACT)OutPut\RV\Files\Static\Release

#Others you may want to include, but I am not using:
#LOGSYSLibraries = $(EVOVMAC)\Output\RV\Lib\Files\Debug
#EOSLibraries   = $(EOSSDK)\lib

以及文件的路径

#  App Paths
AppIncludes = .\include
SrcDir      = .\source
ObjDir      = .\obj
OutDir      = .\Output\$(TerminalType)\$(VMACMode)\Files
ResDir      = .\Resource

我也喜欢在这里定义我的项目名称:

ProjectName = MakeFileTest

请注意,OutDir 使用我们传入的 TerminalTypeVMACMode 以转到唯一文件夹。

接下来,您通常会设置编译器选项

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

#  Switch based on Multi or Single mode (VMACMode)
!if "$(VMACMode)"=="Multi"
VMACIncludes = -I$(EVOVMAC)include
DefineMulti = -DMULTI_APP_ENABLED
!else
VMACIncludes = 
DefineMulti = 
!endif

上面要注意的一个有趣的事情是-DMULTI_APP_ENABLED。我编写的程序有一些依赖于#ifdef MULTI_APP_ENABLED 的块。这不是什么特别的名字——它只是我想出的一个,但是编译器会在它开始编译我的代码之前定义它,所以我可以在这里打开和关闭这些代码块。

接下来,我们将把所有东西都收集起来。我们将首先定义一个新的 var,“Includes”,它将带有标志“-I”(表示“包含”,然后是我们上面所说的所有我们想要包含的内容:

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

请注意,您可以在此处直接输入所有内容,而无需执行定义变量的额外步骤,但它更易于阅读,因此我认为这很正常。

我们对编译器选项做了几乎相同的事情,但请注意,特定标志(例如,“-D”“-p”)已经包含在原始 var 声明中,因此我们将它们放在此处:

COptions    =$(CompilerCompatibility) $(CompileWithLogSys) $(DefineTerminalType) $(DefineMulti) -DDEV_TOGGLES_FOR_SYNTAX 

接下来我们设置一个变量,告诉链接器需要拼接在一起的目标文件在哪里。请注意,如果您像我一样插入新行,则需要“\”来告诉它它在下一行继续

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

我们还将为我们想要链接的任何库设置一个:

Libs = $(ACTLibraries)\act2000.a

好的,接下来我们必须对文件进行签名。我们试图告诉 nMake 我们还将创建资源文件并编译实际代码。 如果我们正在构建多应用程序,那么 pseudoOut 取决于 .res 和 .out 文件。如果不是,那么它只取决于.out,因为没有.res。如果相关文件比 pseudoOut 更近/已更改,则运行命令 vrxhdr...、filesignature... 和 move... 请注意,下面看到的缩进是 nMake 正常工作所必需的。

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

请注意,“echo”命令只是为了帮助我根据需要读取输出日志。

好的,现在我们链接。

“等等!”我听到你说:“我们还没有编译,我们已经发出了签名的命令,现在我们正在链接?这完全不正常!”是和不是。我们实际上还没有发出签名的命令,我们只是告诉nmake我们可能想要这样做以及如果我们决定这样做的话该怎么做。同样,我们还没有发出链接命令,我们只是告诉 nmake 在我们准备好时如何去做。

#  Link object files
$(OutDir)\$(ProjectName).out : $(AppObjects)
    $(EVOSDK)\bin\vrxcc $(COptions) $(AppObjects) $(Libs) -o $(OutDir)\$(ProjectName).out

请记住,多应用程序需要一个 .res 文件。单个应用程序没有。下面将根据需要实际构建 .res 文件。

!if "$(VMACMode)"=="Multi"
#  compile resource file
$(ResDir)\$(ProjectName).res : $(ResDir)\$(ProjectName).rck
    $(EVOTOOLS)rck2 -S$(ResDir)\$(ProjectName) -O$(ResDir)\$(ProjectName) -M
!endif

还记得那些 AppObject 吗?我们终于准备好制作它们了。我正在使用以下标志

  • -c = 仅编译
  • -o = 输出文件名
  • -e"-" => -e 将错误输出从子工具重定向到... "-" 到标准输出。 (这些都通过管道 | 重定向)

同样,无论您在哪里获得 VRXSDK,都应该能够从 VeriFone 获得一些文档。有关标志的更多详细信息,请参见第 59 页的“Verix_eVo_volume 3”

$(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)\myprinter.o : $(SrcDir)\printer.c 
  $(EVOSDK)\bin\vrxcc -c $(COptions) $(Includes) -o $(ObjDir)\printer.o $(SrcDir)\printer.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"

【讨论】:

  • 感谢我的 sdk 文件中有一个 make 文件,但无法正常工作。我从你的教程中创建了一个新的 make 文件。 1 - 在 makefile 中使用了 Libs 变量,但没有设置它。如何在 linke 命令中使用库文件。 2 - 什么是库文件扩展
  • 糟糕。对不起,我错过了那条线。我已将其添加到 AppObjects 部分下的上述代码中。
  • 谢谢。在“VRXSDK\lib”路径中存在许多具有不同扩展名的文件,例如 .a - .lib - .o 和 .so。他们有什么不同。
  • 好问题...我不知道答案
  • 你知道哪个库文件和哪个头文件相关联吗?谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-08-09
  • 2016-04-08
  • 1970-01-01
  • 1970-01-01
  • 2015-07-13
  • 1970-01-01
  • 2016-02-25
  • 2015-07-09
相关资源
最近更新 更多