在上一篇文章当中我们学习了C++当中是如何使用静态库的,这一篇我们会讲一下如何使用动态库,并同样用GLFW这个已有的库来举例子。
有了静态库的经验,其实动态库就好理解和使用多了。这两者的区别是,静态链接发生在编译的时候,会把静态库当中的内容直接插入到exe/dll文件当中,所以编译器会进行一定的优化,因为我们的linker对于我们要塞进来的内容会有一些提前的了解。但是动态库就不一样了,动态链接是发生在runtime进行时当中,必须要在运行之后,动态库的内容才会被加载进入内存,这也使得动态链接的内容可以在运行之前就存在。
但是如果我们有安装一些软件的经历,我们肯定会遇到过关于什么程序因为缺少dll文件而无法启动这类的bug,然后我们去搜一个这样的dll粘贴进去就又能用了。这其实意味着我们的exe file是知道需要有这样一个dll存在的,而且如果不存在就不会启动我们的exe。在这种情况下,我们并不能完全说我们的exe对于dll真的是一无所知。但是也确实会有的情况下,是真的没有提前告知,exe运行起来再去寻找是否插入dll里面的内容。
那么我们还是以之前使用的GLFW库为例,动态库也需要头文件和二进制文件。其中头文件我们可以直接使用之前的头文件,使用和之前相同的添加方式就不会有任何问题。但是在添加二进制文件的时候,我们需要注意:
如图所示,我们有两个看起来和dll有关的文件,一个是glfw3.dll毫无疑问了,但是另一个glfw3dll.lib看起来好像也需要,但是它是一个lib文件啊。这是因为在我们的dll文件里面,可能有很多的函数,我们需要知道头文件里面每一个函数的位置在哪里,但是因为我们在运行时才会加载进来,所以提前我们是不知道它们的位置的,这就需要一个存储着这些函数的指针的库来告诉我们的程序,我们这些函数的位置在哪里,那么这些指针就会存放在一个dll.lib文件当中。所以当我们选择additional dependencies的时候,我们需要一起把这两个库都添加进去。但是我自己测试的结果是,如果把两个库都添加进去了,一定会报错,所以其实实际经验是只需要添加dll.lib库即可。
然后运行依然会发生找不到的错误,这个时候我们需要把我们的可执行文件和exe文件放在同一个目录下,这样exe文件就可以找到目标,顺利编译完成啦。
好了以上就是有关动态库加载的内容,希望大家喜欢!