我正在使用一些使用 Windows 操作系统和 nmake 的库。终端不接受这些库,当我尝试编译代码时出现错误。
我需要包含的库是
#include "iso8583.h"
#include "iso8583_defs_1993.h"
#include "output.h" // for 'DL_OUTPUT_Hex'
#include "appl8583.h"
当我编译代码时,它显示错误
没有任何输入源文件“iso8583_defs_1993.h”
根据你的说法
现在当我编译代码时,它显示错误没有任何输入源文件“iso8583_defs_1993.h”
在我看来,您的 make 文件没有引用必要的目录。
让我们看看你的make文件。您将调用vrxcc
几次,每次都必须传递几个参数。让我们从调用它的地方开始编译(可能在 make 文件的底部)。让我从我的 make 文件中分享这样一行。(注意:这通常都在一行中,但我已经将其分解并添加了 c 风格的注释 (//) 来解释发生了什么。我意识到//
注释在 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
标志传递给编译器。例如,如果您尝试#include "iso8583.h"
从 ACT 库中获取,那么您必须-I$(EVOACT)include
将$(Includes)
. 如果你不这样做,那么你会得到一个错误,说它找不到你正在尝试使用的文件:
“错误:#5:无法打开源输入文件“iso8583_defs_1993.h”:没有这样的文件或目录”
我在上面的评论中询问的原因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
对我来说,如果您尝试导入自定义库(没有源代码——如果您有源代码,那么它将是 的一部分) ,这被定义为BUT,AppObjects
那么您必须在此处添加它们。请注意,您的库需要针对 ARM-11 处理器进行编译,否则将无法工作。如果您有源代码,则可能希望将其添加到您的源代码中AppObjects
。-o $(OutDir)\$(ProjectName).out
只指定输出文件