49 C++中使用库(静态链接)
主要主题:如何在我们的项目中使用外部库
如下是以二进制文件的形式进行链接(GLFW库),而不是获取实际依赖库的源代码并自己进行编译
🍅下载二进制文件
下载32-bit还是下载64-bit的文件,和实际的操作系统没有任何关系,只和你的目标应用程序有关
- 如果要编译的程序是作为X86也就是win32程序,那么就要32位的二进制文件
- 如果在编译一个64位应用程序,那我就要64位的二进制文件
一定要把它们匹配起来!不然它们就无法进行链接
🍅库的结构
库通常包含有两部分:includes
和library
,包含目录和库目录(“包含目录”是一词,就是inlcude目录)
-
**包含目录(include目录)**是一堆我们需要使用的头文件,这样我们就可以实际使用预购建的二进制文件中的函数
-
库目录(ilb目录)有那些预先构建的二进制文件,通常还分为两部分:动态库和静态库(并不是所有库都有这俩),由此可以选择是静态链接还是动态链接
-
静态链接意味着这个库会被放到你的可执行文件中,它在你的exe文件中(或者其他操作系统下的可执行文件)
-
动态链接是在运行时被链接的
这俩的主要区别是:库文件是否被编译到exe文件中或者链接到exe文件中,还是一个单独的文件在运行时把它放到exe文件旁边或某个地方,然后exe文件可以加载它
-
静态链接在技术上更快,有好几种优化的方式可以用。故通常静态链接是最好的选择
后缀dll
的文件是一种运行时的动态链接库,在动态链接时会用到
后缀dll.lib
的文件是一种静态库,它是和dll
一起用的,这样就不需要实际询问dll
了,相当于记录了dll
中所有函数和变量的地址,连接器可以直接链接到它们
后缀lib
的文件就是静态链接库了。(静态库会比动态库大很多!)
🍅链接库的大概操作(具体于P49Cherno)
链接头文件
项目属性 -> 在C/C++下的general -> additional include directories(附加的包含(include)目录)
(此处要注意配置(如debug,all configurations)和平台(如Win32)
然后把库的文件中的include
文件夹的地址放到additional include directories下就可以了。放链接的时候可以直接把地址目录粗暴的丢上去(只实用于自己的电脑),也可以利用宏$(SolutionDir)
获得解决方案的文件地址目录(相对路径),然后再在后面加地址就可以了(实用于所有人的电脑)
完成如上,就可以直接在写代码的时候#include <对应的头文件>
了,但注意头文件里面只有一堆函数的声明,现在还没有具体的链接上库,所以此时的函数是用不了的
养成好习惯:如果头文件的东西在解决方案中的某个地方(或许是另一个项目),那就用引号来包括,如
#include "easyx"
如果它是一个完全的外部依赖或者外部的库,不在vs和我实际的解决方案一起编译,那么就用尖括号,来表示它实际上是外部的,如
#include <easyx>
链接库
项目属性 -> linker -> General -> Additional Library Directories(附加的库目录)
然后放目录地址如上,$SolutionDir
+库目录就好了
然后此时库目录中会有动态库和静态库,比如有glfw3.dll , glfw3.lib
如果只用静态库glfw3.lib
则除了上述操作外还需要:在 项目属性 -> linker -> Input -> Additional Dependencies 上加入glfw3.lib
就可以了(记得要加分号与其他的分隔!)