库的概述和使用

c++的库通常包含零个部分,一个是include文件,一个是library文件,即一个包含目录和一个库目录,在包含目录中存放的是一堆头文件,这样在使用的过程中我们就可以实际使用预构建的二进制文件中的函数,而liberary文件中所包含的就是预先构建的二进制文件,在二进制文件中一般包含两种,一种是静态库,一种是动态库。但是不是所有的库都包含两种库,

静态库和动态库区别在于:

静态库使用静态链接,库会被梵高可执行文件中或者其他操作系统下可执行的文件

动态库使用动态链接,库在运行时被链接的,一些链接可以选择在程序运行时装载动态链接库,有个叫loadLibrary的函数可以在WindowsAPI中使用它作为例子。它可以载入动态库,从中拉出函数然后开始调用函数。也可以选择在程序启动时加载dll文件。

两者主要区别是,是否是连接到exe文件或者编译到exe文件中,还是在运行过程中只用放在exe文件旁边或者其他指定位置,让exe文件加载。

静态链接相对于动态链接在技术上可以更快,因为编译器或者连接器实际上可以执行连接时优化之类的

动态链接在被运行的程序载入时程序的部分将被补充完整

在vs中我们必须先设置,让它指向头文件(include文件)只有这样才知道那些函数可用,我们就可以获得函数声明,其次我们还要将linker(连接器)指向库文件(libaray)文件。无论静态库或者动态库都需要这样的操作。


静态库的使用例子(GLFW):

首先我使用GLFW作为例子(下载地址:https://www.glfw.org

我将该文件的二进制编码放入我的项目根目录下我自己创建的dependencies作为库的存放文件,在其中再创建了GLFW文件,我复制了vc-2022和include文件放入其中,其中的vc-2022的文件最底层包含这几个文件,其中glfw3.dll时动态库,而glfw3dll.dll是与glfw3.dll配套的静态库,这样的话我们就不需要实际询问dll。如果我们没有dll对应的静态库我们也可以使用函数直接访问dll文件内的函数。

image-20240921205548782

使用方法:首先右击项目属性,确保最上方的配置和平台无误后,在c/c++的选项下有个常规中,在附加包含目录中,我们首先指定包含文件库的位置在相对位置的目录下的包含文件。

image-20240921213050006

这样在代码中我们就可以直接调用,如图所示:

image-20240921213326344

其次,在引入头文件后我们可以直接调用函数,如glfwInit,此时不会报错,并且可以正常编译,但是生成时会报错,linker会显示未定义符号,这是因为我们没有链接他的库,我们无法使用它定义的函数。

添加link如下所示:

首先我们将库的目录添加进属性,链接器中的常规的附加库目录指定好库的根目录

image-20240921213735921

然后我们继续在链接器的输入中指定我们的库,注意使用分号与后方的默认配置的目录分开

image-20240921213842767

此时我们就可以正常使用库的功能了,如果上方附加库的目录未定义完整,则附加依赖项就需要额外的输入剩余完整的路径和文件名字,这将很不方便,所以在附加库目录一定要到根目录(可以根据项目的需求灵活改变)。还有种方式如下入股哦不需要头文件,如下所写即可,其中extern “C“ 意思是保持这个函数的原貌,因为可能链接到在c语言建立的库

image-20240921214839460


动态库的使用(接静态库的使用GLFW):

在glfw中它同时支持静态库和动态库的使用,所以头文件和大部分设置都可以不动,但是在连接其中我们需要导入动态库如下(不要直接导入dll文件否则会报错:fatal error LNK1107: 文件无效或损坏: 无法在 0x2D0 处读取):

image-20240921221850561

但是在我们编译过程中没有问题,但是如果生成或者运行时会发生如下报错如下所示:

编译时:

image-20240921220955556

运行时:

image-20240921222108120

此时的解决办法是将dll文件丢入我们的exe文件根目录下(一般在项目文件的Debug文件下),因为在exe文件运行时会在自己的根目录下寻找dll动态库文件,入股哦根目录下没有那么程序无法运行。


资料参考:

youtube上the cherno的cpp系列