概述
C++作为比较老的开发语言,在依赖库的引入上并没有做到像现在Java、JS、C#含有依赖管理工具协助完成大部分内置库、第三方库的自动引入、下载、配置、补全等。
C++无论是内置库还是第三方库,都需要自己手动进行查找、配置、引入等工作。
本文即是帮助完成C++项目对于库、框架如何完成依赖引入达成可调用的目的,重点讲述开发工具Visual Studio中的操作,若是在命令行使用CMake链接库可参考以下链接中关于库、链接的配置说明:CMakeLists详解
静态库(.lib)
静态库引入适用用于大部分无开源的第三方库,开发者不需要关心库的具体实现如何,直接将库文件放到自己的项目里,引入进行调用即可,非常方便可靠。
无论库是否有开源,最终能通过生成或下载拿到静态库文件.lib
和头文件.h
即可使用静态库引入方式。步骤如下:
已编译好的库
使用glfw作为示例官方下载地址:
- 将下载好的静态库文件
glfw.lib
和glfw.h
按照想要的路径放置到解决方案里,例如【解决方案】\Dependencies\glfw\
文件夹里; - 在VS开发工具里打开应用程序项目属性(右键打开),找到C++》常规》附加包含目录,添加头文件所在基础路径
$(SolutionDir)\Dependencies\glfw\;
。注意第一是顶部要选择全部配置和全部平台,如果只选择了其中一种配置和平台可能会报错。其次是不要删除原本附加包含目录里已有的路径,只使用分号隔开,除非你确定那些路径已经不需要; - 接着上一步,重新在属性里找链接器》常规》附加库目录,添加静态库文件所在基础路径
$(SolutionDir)\Dependencies\glfw\;
。之后找到链接器》输入》附加依赖项,添加静态库剩余路径glfw3.lib
,基础路径和剩余路径合起来才是静态库的完整路径$(SolutionDir)\Dependencies\glfw\glfw3.lib
; - 在需要使用该库的项目文件代码里引入头文件,路径根据第2步基础路径所决定,如
#include <glfw3.h>
指向的是$(SolutionDir)\Dependencies\glfw\glfw3.h
; - 现在可以开始调用静态库里的方法了,代码示例:
#include <iostream>
#include <glfw3.h>
int main() {
int a = glfwInit();
std::cout << a << std::endl;
}
引用依赖库
适用于有源代码的库,例如第三方开源库,或者自己的库。
相比静态库有更好的灵活性,方便对库进行专门的优化或定制开发。
可以不放到当前解决方案里,直接作为单独项目生成静态库文件和头文件,然后按照上述方式引入静态库,也可以按照下面的方法,将源代码放到解决方案里作为单独一个库项目,让应用程序项目引入,这种方式的好处是根据应用程序需要修改库代码。
还是使用上一步有开源的glfw作为示例:
- 将下载好的库源代码放置到解决方案里,如放到
【解决方案】\glfw\
文件夹里; - 在VS开发工具里打开该项目属性,找到常规》配置类型,将其选择为静态库(.lib),完成后按顺序点击下方应用Apply、确定OK按钮;
- 在VS开发工具里打开应用程序项目属性,找到C++》常规》附加包含目录,添加头文件所在基础路径
$(SolutionDir)\glfw\src\;
; - 接着在VS开发工具应用程序项目打开引用栏(项目右键选择添加》引用),里面可以看到当前解决方案下所有库项目,包括我们第2步配置glfw库项目的名称和路径,在想要依赖的库项目前面打钩,并点击下方确定OK;
- 在需要使用该库的项目文件代码里引入头文件
glfw3.h
,路径根据第2步基础路径所决定,如#include <glfw3.h>
指向的是$(SolutionDir)\glfw\src\glfw3.h
; - 现在可以开始调用引用依赖库的方法了,代码示例:
#include <iostream>
#include <glfw3.h>
int main() {
int a = glfwInit();
std::cout << a << std::endl;
}
动态库(.dll)
优点是可以大幅减少exe文件的大小,让库文件在多个exe文件之间共享,适用于需要发布多个应用的解决方案,例如同时包含执行程序、更新程序、修复程序多个exe文件的大型应用。
主要用于第三方库为主,虽然也可以用于自己的库项目,但考虑到静态库比动态库总体积更小更高效率来说,自己的库项目还是直接放到解决方案里添加引用依赖即可。
依旧使用glfw动态库作为示例:
- 将下载好的动态库
glfw.dll
、glfw3dll.lib
(动态库专用的链接文件)和glfw.h
放到依赖下$(SolutionDir)\Dependencies\glfw\
; - 在VS开发工具里打开应用程序项目属性,找到C++》常规》附加包含目录,添加头文件所在基础路径
$(SolutionDir)\Dependencies\glfw\;
; - 接着上一步,重新在属性里找链接器》常规》附加库目录,添加动态库文件所在基础路径
$(SolutionDir)\Dependencies\glfw\;
。之后找到链接器》输入》附加依赖项,添加静态库剩余路径glfw3dll.lib
,基础路径和剩余路径合起来才是静态库的完整路径$(SolutionDir)\Dependencies\glfw\glfw3dll.lib
; - 将动态库
glfw.dll
放到应用程序所生成的exe文件的旁边(否则点击exe直接运行时会报错找不到glfw.dll库); - 在需要使用该库的项目文件代码里引入头文件,路径根据第2步基础路径所决定,如
#include <glfw3.h>
指向的是$(SolutionDir)\Dependencies\glfw\glfw3.h
; - 现在可以开始调用动态库里的方法了,代码示例:
#include <iostream>
#include <glfw3.h>
int main() {
int a = glfwInit();
std::cout << a << std::endl;
}