当我在C++上编译SDL项目时,它会为我创建一个可执行文件。当我运行该可执行文件时,如果我在同一个目录中没有SDL.dll,它将不起作用。我明白,因为它需要找到所有正在使用的库和API。编译器编译也包含了吗?
但是当我创造我自己的图书馆,包括它的代码,为什么不它需要在同一个目录?为什么它可以被彻底删除并且可执行文件仍然可以运行?例如,我自己的库和SDL有什么区别?
当我在C++上编译SDL项目时,它会为我创建一个可执行文件。当我运行该可执行文件时,如果我在同一个目录中没有SDL.dll,它将不起作用。我明白,因为它需要找到所有正在使用的库和API。编译器编译也包含了吗?
但是当我创造我自己的图书馆,包括它的代码,为什么不它需要在同一个目录?为什么它可以被彻底删除并且可执行文件仍然可以运行?例如,我自己的库和SDL有什么区别?
是什么编译器编译是一个翻译单元,或编译单元。这包括每个cpp文件的标题。
然后你有链接器。这将您编译的代码链接成可用的表单。
的.DLL文件很可能是搜索和当包含您的应用程序运行。
当您使用自己的图书馆,你可能包含到您的链接步骤程序。 (静态链接)您可以删除它,因为它不再需要。
(因为你给的细节是有点不清楚 - 这可能是也可能不是故事的全部)
我不是专家,但我认为这个信息可能是
编译依赖于有用使用compilator但是它通常需要4个步骤,这是GCC的一个例子:
在第一步骤中的compilator替换包括生成.i文件,该文件具有包括头但不是那些的执行。
在编译步骤中,编译器处理.i文件并输出.s文件,该文件包含翻译成装配方案,没有实现尚未。
在第三步骤中,.s文件被翻译成机器代码,生成.OBJ二进制文件(因为a.out的已过时通常在ELF格式中,文件扩展名是只是传承)
在第四步骤中,所有.obj文件都与其他.obj和静态库链接,在这里,所有这些文件的代码都合并到最终的可执行文件中。
如果有未实现的功能,但根据需要在链接步骤一dynlib已申报链接和运行后,程序将寻找它的主机,这就是正在发生的事情向你SDL。
有2个可能的修复您的问题。
(正确)将SDL2.dll与您的二进制文件一起运输并在安装中进行设置。
(不知错)建立SDL静态OBJ和与二进制建立一个独立的可执行文件
祝你好运链接它;)
你编译自己的库作为静态库? – tkausl
我的意思是我自己的头文件和cpp文件。 –