1

我正在使用一些使用 Windows 操作系统和 nmake 的库。终端不接受这些库,当我尝试编译代码时出现错误。

我需要包含的库是

#include "iso8583.h"
#include "iso8583_defs_1993.h"
#include "output.h" // for 'DL_OUTPUT_Hex'
#include "appl8583.h"

当我编译代码时,它显示错误

没有任何输入源文件“iso8583_defs_1993.h”

4

1 回答 1

1

根据你的说法

现在当我编译代码时,它显示错误没有任何输入源文件“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只指定输出文件
于 2015-07-09T16:32:46.163 回答