2017-02-13 104 views
-4

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

但是当我创造我自己的图书馆,包括它的代码,为什么不它需要在同一个目录?为什么它可以被彻底删除并且可执行文件仍然可以运行?例如,我自己的库和SDL有什么区别?

+2

你编译自己的库作为静态库? – tkausl

+0

我的意思是我自己的头文件和cpp文件。 –

回答

1

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

然后你有链接器。这将您编译的代码链接成可用的表单。

的.DLL文件很可能是搜索和当包含您的应用程序运行。

当您使用自己的图书馆,你可能包含到您的链接步骤程序。 (静态链接)您可以删除它,因为它不再需要。

(因为你给的细节是有点不清楚 - 这可能是也可能不是故事的全部)

0

我不是专家,但我认为这个信息可能是

编译依赖于有用使用compilator但是它通常需要4个步骤,这是GCC的一个例子:

  • 预处理
  • 汇编
  • 屁股embly

在第一步骤中的compilator替换包括生成.i文件,该文件具有包括头但不是那些的执行。

在编译步骤中,编译器处理.i文件并输出.s文件,该文件包含翻译成装配方案,没有实现尚未。

在第三步骤中,.s文件被翻译成机器代码,生成.OBJ二进制文件(因为a.out的已过时通常在ELF格式中,文件扩展名是只是传承)

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

如果有未实现的功能,但根据需要在链接步骤一dynlib已申报链接和运行后,程序将寻找它的主机,这就是正在发生的事情向你SDL。

有2个可能的修复您的问题。

  • (正确)将SDL2.dll与您的二进制文件一起运输并在安装中进行设置。

  • (不知错)建立SDL静态OBJ和与二进制建立一个独立的可执行文件

祝你好运链接它;)