编译器编译也包括在内吗?

时间:2017-02-13 20:50:55

标签: c++

当我在C ++上编译SDL项目时,它为我创建了一个可执行文件。当我运行该可执行文件时,如果我在同一目录中没有SDL.dll,则它不起作用。我理解,因为它需要找到正在使用的所有库和API。

但是当我创建自己的库并将其包含在代码中时,为什么它不需要在同一个目录中呢?为什么它可以完全删除,可执行文件仍然可以运行?我自己的库和SDL在示例中有什么区别?

2 个答案:

答案 0 :(得分:1)

是的,编译器编译的是翻译单元或编译单元。这包括每个cpp文件的标头。

然后你有链接器。这会将已编译的代码链接为可用的表单。

可能会在应用程序运行时搜索并包含.dll。

当您使用自己的库时,可能会在链接步骤中将其包含在您的程序中。 (静态链接)您可以删除它,因为不再需要它。

(因为您提供的详细信息有点不清楚 - 这可能是也可能不是全部故事)

答案 1 :(得分:0)

我不是专家,但我认为此信息可能有用

编译取决于使用的编译器,但通常需要4个步骤,这是GCC的一个例子:

  • 预处理
  • 汇编
  • 组件

在第一步中,编译器替换了包含生成.i文件的包含,此文件包含已包含的标题,但不包含那些文件的实现。

在编译步骤中,编译器处理.i文件并输出.s文件,该文件包含转换为程序集的程序,尚未实现。

在第三步中,.s文件被转换为机器代码,生成.obj二进制文件(通常是ELF格式,因为不推荐使用a.out,文件扩展名只是遗产)

在第四步中,所有.obj文件都与其他.obj和静态库链接,在这里,所有这些文件的代码都合并在最终的可执行文件中。

如果在链接和运行之后没有实现功能但是在链接步骤中已经声明了dynlib,则程序将在主机中查找它,这是发生在你身上的事情与SDL。

您的问题有两种可能的解决方法。

  • (正确)使用您的二进制文件发送SDL2.dll并在安装中进行设置。

  • (不知何故错误)将SDL构建为静态obj并将其与构建独立可执行文件的二进制文件链接

祝你好运;)