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

编译器也编译include吗? 当我编译C++上的SDL项目时,它为我创建了一个可执行文件。当我运行该可执行文件时,如果同一目录中没有SDL.dll,它将不起作用。我理解这一点,因为它需要找到所有正在使用的库和API,c++,C++,但是,当我创建自己的库并将其包含在代码中时,为什么不需要将它放在同一个目录中呢?为什么它可以被完全删除,而可执行文件仍然可以运行?我自己的库与示例中的SDL有什么区别?是的,编译器编译的是翻译单元或编译单元。这包括每个cpp文件的标题 然后你有了链接器。这会将编译后的代码链接成可用的形式 在应用程序运行时,可能会搜索并包含.dll 当您使用自己的库时,您可能会在链接步骤中将其包含到程序中。(静态链接)您可以删除它,因为不再需要它 (因为你提供的细节有点不清楚——这可能是全部,也可能不是全部)我不

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

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

然后你有了链接器。这会将编译后的代码链接成可用的形式

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

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


(因为你提供的细节有点不清楚——这可能是全部,也可能不是全部)

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

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

  • 预处理
  • 汇编
  • 装配
  • 连接
在第一步中,编译器替换includes生成.i文件,该文件包含头文件,但不包含这些头文件的实现

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

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

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

如果在链接和运行之后,有一个函数没有实现,但是在链接步骤中根据需要声明了一个dynlib,那么程序将在主机中查找它,这就是SDL所发生的情况

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

  • (正确)随二进制文件一起提供SDL2.dll,并在安装中进行设置

  • (有点错误)将SDL构建为静态obj,并将其与二进制文件链接,构建一个独立的可执行文件


祝你好运;)

您是否将自己的库编译为静态库?我指的是我自己的头文件和cpp文件。