当我在C ++上编译SDL项目时,它为我创建了一个可执行文件。当我运行该可执行文件时,如果我在同一目录中没有SDL.dll,则它不起作用。我理解,因为它需要找到正在使用的所有库和API。
但是当我创建自己的库并将其包含在代码中时,为什么它不需要在同一个目录中呢?为什么它可以完全删除,可执行文件仍然可以运行?我自己的库和SDL在示例中有什么区别?
答案 0 :(得分:1)
是的,编译器编译的是翻译单元或编译单元。这包括每个cpp文件的标头。
然后你有链接器。这会将已编译的代码链接为可用的表单。
可能会在应用程序运行时搜索并包含.dll。
当您使用自己的库时,可能会在链接步骤中将其包含在您的程序中。 (静态链接)您可以删除它,因为不再需要它。
(因为您提供的详细信息有点不清楚 - 这可能是也可能不是全部故事)
答案 1 :(得分:0)
我不是专家,但我认为此信息可能有用
编译取决于使用的编译器,但通常需要4个步骤,这是GCC的一个例子:
在第一步中,编译器替换了包含生成.i文件的包含,此文件包含已包含的标题,但不包含那些文件的实现。
在编译步骤中,编译器处理.i文件并输出.s文件,该文件包含转换为程序集的程序,尚未实现。
在第三步中,.s文件被转换为机器代码,生成.obj二进制文件(通常是ELF格式,因为不推荐使用a.out,文件扩展名只是遗产)
在第四步中,所有.obj文件都与其他.obj和静态库链接,在这里,所有这些文件的代码都合并在最终的可执行文件中。
如果在链接和运行之后没有实现功能但是在链接步骤中已经声明了dynlib,则程序将在主机中查找它,这是发生在你身上的事情与SDL。
您的问题有两种可能的解决方法。
(正确)使用您的二进制文件发送SDL2.dll并在安装中进行设置。
(不知何故错误)将SDL构建为静态obj并将其与构建独立可执行文件的二进制文件链接