Visual c++ 汇编过程

Visual c++ 汇编过程,visual-c++,compiler-construction,lua,visual-c++-6,Visual C++,Compiler Construction,Lua,Visual C++ 6,有人能解释一下编译是如何工作的吗 我似乎不明白编译是如何工作的 更具体地说,这里有一个例子。。我正在尝试用MSVC++6编写一些代码来加载Lua状态 我已经: 为库设置附加目录,并将文件包含到正确的目录中 使用外部“C”(因为我听说Lua只是C) 包含正确的头文件 但是我仍然在MSVC++6中遇到一些关于未解析外部符号的错误(对于我使用的Lua函数) 虽然我很想知道如何解决这个问题并继续前进,但我认为如果我能理解其中涉及的基本过程,对我来说会更好,那么谁能为这个问题写一个好的解释呢?我想知

有人能解释一下编译是如何工作的吗

我似乎不明白编译是如何工作的

更具体地说,这里有一个例子。。我正在尝试用MSVC++6编写一些代码来加载Lua状态

我已经:

  • 为库设置附加目录,并将文件包含到正确的目录中
  • 使用外部“C”(因为我听说Lua只是C)
  • 包含正确的头文件
但是我仍然在MSVC++6中遇到一些关于未解析外部符号的错误(对于我使用的Lua函数)

虽然我很想知道如何解决这个问题并继续前进,但我认为如果我能理解其中涉及的基本过程,对我来说会更好,那么谁能为这个问题写一个好的解释呢?我想知道的是过程。。它可能是这样的:

步骤1:

  • 输入:源代码
  • 流程:解析(可能在此处添加更多细节)
  • 输出:此处输出的内容
步骤2:

  • 输入:第1步输出的内容,加上可能需要的其他内容(库?DLL?.so?.lib?)
  • 过程:对输入所做的一切
  • 输出:任何输出
等等

谢谢

也许这将解释什么是符号,什么是“链接”,什么是“对象”代码或其他什么

谢谢。。对不起,我是个笨蛋

另外,这不一定是特定于语言的。。但请随意用您最熟悉的语言表达:)

编辑:无论如何,我能够解决错误,结果是我必须手动将.lib文件添加到项目中;仅在IDE设置或项目设置中指定库目录(即.lib所在的目录)不起作用

然而,下面的答案多少帮助我更好地理解了这个过程。非常感谢!。。如果还有人想写一本详尽的指南,请写:)

编辑:为了补充参考,我找到了一位作者(Mike Diehl)的两篇文章来很好地解释这一点:)

您必须进入项目设置,并在“链接器”选项卡的某个位置添加一个目录,其中包含LUA library*.lib文件。设置为“包括库”或其他,抱歉,我无法查找

之所以得到“未解决的外部符号”,是因为C++中的编译工作分两个阶段进行。首先,代码被编译,每个.cpp文件都在它自己的.obj文件中,然后“链接器”启动并将所有的.obj文件连接到.exe文件中。lib文件只是一组合并在一起的.obj文件,使库的分发更加简单。 因此,通过添加所有“#include”和extern声明,您告诉编译器在某个地方可以找到带有这些签名的代码,但链接器找不到这些代码,因为它不知道那些带有实际代码的.lib文件放在哪里

确保您已经阅读了该库的REDME,通常他们会非常详细地解释如何将其包含在代码中。

步骤1-编译器:

  • 输入:源代码文件[s]
  • 过程:解析源代码并翻译成机器代码
  • 输出:对象文件,包括:
    • 此对象中定义的以及此对象文件“导出”的符号的名称
    • 与此对象文件中定义的每个符号关联的机器代码
    • 未在本目标文件中定义,但本目标文件中的软件所依赖且随后必须链接到的符号名称,即本目标文件“导入”的名称
步骤2-链接:

  • 输入:
    • 步骤1中的对象文件
    • 其他对象库(例如来自O/S和其他软件)
  • 过程:
    • 对于要链接的每个对象
    • 获取此对象导入的符号列表
    • 在其他库中查找这些符号
    • 将相应的库链接到对象文件
  • 输出:一个单独的可执行文件,其中包括所有对象的机器代码,以及导入(链接)到对象的库中的对象

两个主要步骤是编译和链接

编译采用单个编译单元(这些单元只是源文件,包含所有头文件)并创建对象文件。现在,在这些对象文件中,有很多函数(和其他东西,比如静态数据)定义在特定的位置(地址)。在下一步链接中,还需要一些关于这些函数的额外信息:它们的名称。所以这些都是存储的。单个对象文件可以引用其他对象文件中实际存在的函数(因为它希望在运行代码时调用它们),但由于我们在这里处理的是单个对象文件,因此对象文件中只存储对这些其他函数的符号引用(它们的“名称”)

接下来是链接(让我们限制自己在这里使用静态链接)。链接是将在第一步中创建的对象文件(直接创建,或在将它们一起放入.lib文件后创建)放在一起并创建可执行文件的地方。 在链接步骤中,通过在正确的对象中查找名称、找到函数的地址并将地址放在正确的位置,解析从一个对象文件或库到另一个对象文件或库的所有符号引用(如果可以)

现在,解释一下你需要的“外部”C:

C没有函数重载。函数总是可以通过其名称识别的。因此,当您将代码编译为C代码时,只有函数的真实名称存储在对象文件中

然而,C++有一种叫做“函数/方法”的东西
#include <bob.h>
int x = bob_fn(7);

cc -c -o xx.obj xx.c
cc -o xx.exe xx.obj -L/bob/libs;/usr/lib -lbob