C++中使用库
分为两种,静态库和动态库。简单来说,静态库最后会被编译进二进制文件,动态库不会,需要二进制文件从外部载入。
以下操作均在Visual Studio 2022中进行,以32位GLFW为例子(glfw.org)。
首先下载glfw 32位的可执行程序。在解决方案目录创建一个Dependencies文件夹(名字无所谓),然后把glfw丢进去。
静态链接
修改属性配置时,注意配置范围和平台,这里使用的是32位的glfw,我希望debug和release都使用,就如图设置。
一定不要搞错啦!
设置Include路径
首先需要头文件,打开项目属性,配置属性 > C/C++ > 常规 > 附加包含目录
, 输入$(SolutionDir)Dependencies\GLFW\include
这里的$(SolutionDir)表示解决方案目录,如果你放在了其他地方,注意修改路径。尽量避免使用绝对路径。
然后这个时候,在项目中引入头文件就行。
#include<iostream>
#include "GLFW/glfw3.h"
int main() {
int a = glfwInit();
std::cout << a << std::endl;
return 0;
}
但是有个问题,无法编译通过,因为找不到库。
设置库路径
打开项目属性,配置属性 > 链接器 > 常规 > 附加库目录
,添加$(SolutionDir)Dependencies\GLFW\lib-vc2022;
这里的$(SolutionDir)表示解决方案目录,如果你放在了其他地方,注意修改路径。尽量避免使用绝对路径。
打开项目属性,配置属性 > 链接器 > 输入 > 附加依赖项
,添加glfw3.lib
(多个依赖性分号隔开)
这里的glfw3.lib是静态库,动态库下面再说。
这个时候就可以正常使用了:
#include<iostream>
#include "GLFW/glfw3.h"
// 依旧是这个代码
int main() {
int a = glfwInit();
std::cout << a << std::endl;
return 0;
}
这次编译通过,输出了1,表示glfwInit
函数调用正常。
动态链接
设置Include路径
同上,一样一样的。
设置库路径
上面说到,打开项目属性,配置属性 > 链接器 > 输入 > 附加依赖项
,添加glfw3.lib
,这个 glfw3.lib
就是一个静态库。在这个目录下还能看到这样两个文件:
- glfw3.dll
- glfw3dll.lib
glfw3dll.lib
就是动态库文件了,所以我们只需要把上面的glfw3.lib
改为glfw3dll.lib
。然后编译出来的程序就会寻找 glfw3.dll
,从中加载出我们调用的函数。Like This:
然后就...
程序根本不知道你的dll文件在哪。通常程序会在同目录寻找dll文件,所以将glfw3.dll
放到程序所在目录即可。Like This:
再次运行程序就不报错了。如果你想要放在其他路径,有下面几种方法:
-
Linux中可以用 LD_LIBRARY_PATH 环境变量指定,这个类似于 PATH 机制(Windows就用PATH环境变量),比较直观,而且,可以放到 bashrc 中固化下来,也可以放到自己的 .bashrc 中只对本用户起作用;
-
如果只想对某一个特定的应用程序起作用的话,可以在编译时指定搜索路径。gcc 的 -Wl 和 -rpath 参数。