根据您的陈述
现在当我编译代码时,它显示错误 no any input source file "iso8583_defs_1993.h"
听起来你的 make 文件没有引用必要的目录。
让我们看看你的 make 文件。你将调用vrxcc 几次,每次你必须传递几个参数。让我们从调用它的地方开始编译(可能在 make 文件的底部)。让我从我的 make 文件中分享这样一行。 (注意:这通常都在一行中,但我已将其分解并添加了 c 样式 cmets (//) 来解释发生了什么。我意识到 // cmets 在 make 文件中不起作用,但它们这里可读性很强)
-$(EVOSDK)\bin\vrxcc // invokes the compiler
-c // compile only
$(COptions) // my variable that passes compiler options
$(Includes) // my variable that passes all the directories to include
-o $(ObjDir)\$(ProjectName).o // output the object file here
$(SrcDir)\$(ProjectName).c // the input file (to compile)
-e"-" | "$(EVOTOOLS)fmterrorARM.exe" // where to send error output
(有关编译和链接的更多信息,请参阅%evosdk%\..\Docs\DOC00303_Verix_eVo_Volume_III Operating_System Programming_Tools_Reference_Manual.doc)
现在,该命令的每个部分都具有重要意义,但就本次讨论而言,我们需要重点关注的是$(Includes)。让我告诉你这对我来说是什么:
Includes = -I$(AppIncludes) //Where AppIncludes = .\include
$(SDKIncludes) //Where SDKIncludes = -I$(EVOSDK)\include
$(ACTIncludes) //Where ACTIncludes = -I$(EVOACT)include
$(VMACIncludes)//Where VMACIncludes = -I$(EVOVMAC)include
$(VCSIncludes) //Where VCSIncludes = -I$(EVOVCS)include
任何时候你想#include 某个东西,该文件所在的目录必须使用-I 标志传递给编译器。例如,如果您尝试从 ACT 库中发送 #include "iso8583.h",那么您必须将 -I$(EVOACT)include 作为 $(Includes) 的一部分。如果你不这样做,那么你会得到一个错误,说它找不到你正在尝试使用的文件:
“错误:#5:无法打开源输入文件“iso8583_defs_1993.h”:没有这样的文件或目录”
我在上面的 cmets 中询问 Where do these header files live/where did they come from? 的原因是因为我假设 iso8583_defs_1993.h 是您随身携带的自定义库或代码文件。如果是这种情况,那么无论该文件位于何处,您都需要确保它也是 $(Includes) 的一部分。
编译完所有内容后,我们仍然需要将所有内容链接在一起。 (注意:由于 nmake 使用文件更改作为依赖项,因此链接部分在 make 文件中的位置可能高于编译部分。)我只有 1 个链接行,它看起来像这样:
$(EVOSDK)\bin\vrxcc $(COptions) $(AppObjects) $(Libs) -o $(OutDir)\$(ProjectName).out
-
$(COptions) 和我们传递给编译器的一样
-
$(AppObjects) 是我的变量。我有几个 .c 文件,每个文件都被编译成一个目标文件。这代表每个 .o 文件
-
$(Libs) 您想要包含的任何外部库。对我来说,这被定义为Libs = $(ACTLibraries)\act2000.a 但如果您尝试导入自定义库(没有源代码——如果您有源代码,那么它将成为AppObjects 的一部分),那么您必须在此处添加它们。 请注意,您的库需要针对 ARM-11 处理器进行编译,否则将无法工作。如果您有源代码,您可能希望将其添加到您的 AppObjects。
-
-o $(OutDir)\$(ProjectName).out 只是指定输出文件