Visual Studio 下配置第三方C/C++库的方法
一些常用的函数、类等会被封装打包成库(以 OSG为例),以供开发人员使用。为了能正确调用所需的库,需先告知所用的编程开发工具(以 Visual Studio 为例)和操作系统(以 win 10 为例)在哪里寻找所需的库,这就是所谓的配置第三方库。
明确几个概念
概念1:在程序的源文件(如 .c 和 .cpp 文件)编辑阶段,为了使用第三方库,我们一般会在编辑器中使用 #include 指令来包含库的头文件( .h或 .hpp 文件),那么就需要告知 Visual Studio 第三方库的头文件在什么地方。
概念2:编写好程序的源文件后,在编译阶段,编译器会根据头文件中声明的函数、类等信息去寻找这个函数或类的实现文件(如 .lib 文件),这就需要告知 Visual Studio 第三方库中的函数、类等的实现文件在什么地方。
概念3:源文件经过编译后会生成一系列目标文件(如 .o 文件),然后链接器将目标文件链接起来形成最终的可执行文件(如 .exe 文件),这就需要告知链接器具体需要链接第三方库中的哪些库文件,一般第三方库会包含很多模块,可以只选择自己需要的模块的库文件,这样在调试编译时会快一些,如果不是特别影响速度的话,也可直接包含第三方库的总的库文件。
概念4:链接器在链接目标文件并生成最终的可执行文件时,有静态链接和动态链接两种方式。静态链接就是将所用到的第三方库的内容包含进程序的可执行文件中(如 .exe 文件),这样在没有安装所需库的相应功能的计算机上也可以直接运行该程序,缺点是,如果用到的库的内容比较大的话,最终程序的可执行文件相应的也很大。动态链接就是不将所用到的第三方库的内容包含进程序的可执行文件中,而只是写入一些必要的信息,以便程序运行时能正确调用所需功能。这个时候就需要计算机上装有第三方库,并正确配置计算机的环境变量,以便程序运行时能正确找到所需的动态链接库。
具体配置过程(以osg库和win10系统为例)
1 安装第三方库及配置环境变量
详见https://blog.csdn.net/william_munch/article/details/105138835
下载安装好第三方库后,可以首先配置环境变量,以便使用到该库的动态链接库的程序能在该计算机上正确运行。
双击系统变量(与用户变量的区别请自行百度,一般在系统变量下配置即可)下的path一行,或者选择后点击编辑按钮,弹出编辑环境变量窗口。
选择右方的新建,输入动态链接库文件(.dll文件)所在的位置,添加完路径后一路确定下去即完成了环境变量的配置。
2 新建一个 Visual Studio 项目
这里新建一个控制台应用程序。
3 打开并配置项目属性页
完成后,项目就建立了,右键调出项目属性窗口进行配置(后面还有在属性管理器中进行配置的方法,两种方法的区别后面会讲)
弹出项目属性页,这里有个问题需要注意,属性页上方两个选框“配置”和“平台”需要根据项目情况选择合适的选项,默认的是当前活动配置,即Debug调试模式和32位即x86,因为我的osg库是64位的,所以要将平台改为x64,debug和release下面的配置方法都是一样的,这里以debug加x64下的配置为例。
4 配置第三方库的头文件所在的位置
改好项目属性页的配置和平台后,进入“VC++目录”->“包含目录”弹出包含目录设置窗口,这里即是指定第三方库头文件的位置(对应本文开头讲到的概念1),头文件一般都在库的安装目录下的build->include文件夹中
5 配置第三方库的实现文件所在的位置
确定后,进入“VC++目录”->“库目录”弹出库目录设置窗口,这里即是指定第三方库实现文件的位置(对应本文开头讲到的概念2)
确定后,可以看到新配置的选项以黑体突出显示,点击应用。
6 指定链接器具体要使用哪几个库文件
接着转到“链接器”->“输入”->“附加依赖项”中设置需要用到的库文件(对应本文开头讲到的概念3),如下图所示,我们看到osg总的库文件有两种,区别是一个名字后面有个字母d,表示debug,也就是如果项目属性页上面的“配置”中选择的是debug,则此处添加这个库文件,如果是release,则添加另外一个,直接将库文件全名复制粘贴进去,应用后一路确定就完成了debug模式下项目所需的第三方库的配置。
release模式下的配置过程是一样的,这里就不赘述了。
测试
在源文件中添加一个C++文件,输入如下内容,红框指定包含了新的osg库的头文件。
另一种第三方库的配置方式
前面是通过右键点击项目名称选择属性来调出项目属性配置页的,这种方式配置完成后,所有配置参数只对本项目有效,新建一个另外的项目,如果也要调用这个第三方库,那么就需要按照上面的方法再走一遍配置流程。如果自己的项目所用的第三方库比较固定,那么可以采用下面的方式进行配置,这种方法配置完成后可以针对某一类程序有效,不需要每次新建一个项目就要配置一次那么麻烦。
按照前面的方式新建一个控制台应用程序,然后如图所示调出属性管理器。
这里可以看到我们的项目名称下面有四个选项,其实就是我们之前方法中的项目属性页顶端的“配置”和“平台”的几种组合,这里一样我们选择自己需要的组合,我现在配置debug模式,我的osg库是64位的,如图所示,展开这个文件夹后,可以看到 Microsoft.Cpp.x64.user,在这个下面进行配置的话,以后所有新建的控制台应用程序会自动继承这里的配置,从而一劳永逸。
右键Microsoft.Cpp.x64.user调出菜单并选择属性,可以看到弹出的配置窗口和我们之前从解决方案窗口中项目名称右键进入的属性配置页一模一样,区别就是属性页上方的“配置”和“平台”变成灰色不可用的,因为我们上一步已经指定了这两项。
多说几句
对于新人来说,如何正确搭建开发平台一直都是个很烦恼的问题,其实搞明白了本文开头的几个概念,后面的配置就是顺理成章,一目了然的了。但可能很多新人有这样的疑问,下图的蓝色的配置项跟之前的有什么区别和联系?请听我慢慢道来(复制自原文:https://www.cnblogs.com/JMLiu/p/7954630.html)
首先
这是个历史遗留问题,说起来比较复杂。其次,这个问题在微软的MSDN博客上已经专门被说起过了,英文好的请直接移步到原文:《VC++ Directories》。另外,stack overflow上面也有人问到过,但是首选回答的人回答是错的,因为他没看 《VC++ Directories》,主要看后面的这段:
VC++ Directories: Include Directories
- this value is inherited from the
INCLUDE
Windows environment variable which is defined outside of Visual Studio
- environment variables can be: global to the computer or have user level scope
- The
INCLUDE
andLIB
environment variables are created when the Microsoft Windows SDK is installed with Visual Studio.C/C++: Additional Include Directories
- is a project level setting... you will have to define this value for every project in your solution
- this value can be persisted to source control
其实
VC++目录(VC++ Directories)本来是对应于SDK的,他的变量是一个Windows环境变量,就和你在操作系统的控制面板里面添加的环境变量是一样的,比如这也有PATH,这个PATH和你在控制面板里面的PATH是一样的。但是,毕竟这个是用于搞开发的一些环境变量,所以呢,就把它搞到继承开发环境里面来设置了,这样你就可以不用在操作系统的控制面板里设置他们,而且这些环境只在VS中有效。
而C/C++中的设置呢,它不是设置环境变量,它是设置命令行参数的,所以你可以很清晰的看到,它还有一个命令行(Command Line)设置项,这个项分两块,上面是根据你前面填写项的指生成的,比如你的附加包含目录(Additional Include Directories)设置,就会对应到 /I [path]上面来,下面有个叫其他选项(Adittion Option)的框框,是供你填一些上面没有的或者其他需要补充的命令行参数的。既然是命令行参数,那肯定是针对当前这个工程的了。
本来一切已经很明确了:“VC++目录”影响全局,只要是电脑上的这个VS创建的工程,都会被这个设置影像到; 而C/C++只影响到单个的工程,一个工程一个C/C++。
但是怪就怪在,微软觉得这种全局的方式太粗暴了,所以在VS2010之后,“VC++目录”变得也只影响单个工程了,而且还只能在工程上右键“属性”才能大概,以表示它是属于这个工程的。在VS2008中,这个设置还可以从Tools菜单中打开。所以,在VS2010之后,这二者就变成没区别了。
但是真的没区别了吗?呵呵,区别大了
前面已经说过了,VC++ Directories是一个Windows环境变量,C/C++是命令行参数,这是本质区别;但是相同的项,也就是VC++ Directories中的include directories 对应到C/C++中的addition include directories 是一样的效果,也就是说效果一样。同样是命令行参数的还有Link设置,Link设置中的 addition library directories对应到VC++ Directories 中的library directories,也就是说,效果是相同的。
总之,很坑。