Windows下多个库的快速配置——opencv/ boost/opengl/glew/freeglut/glog/protobuf

        点击下载,解压好之后只有一个usr目录,其中包含了opencv、opengl、glew、freeglut、glog、protobuf等,你只需要经过下列三个步骤,就可以一次性永久配置好环境,当然,如果你对库原本就有一些理解,那你应该马上就懂了,如果你常在Linux上配置环境,那你会发现我做的事情其实很简单,就是把各个库集中起来,有点类似于linux中库的安装方法,因此配置变得非常便捷了,博主采用全静态编译,在使用时只需要注意使用静态库就可以了。让我们开始吧。

        \usr 文件夹 下有三个文件夹:

        \usr\include 文件夹 下为各个库的头文件,其中有OpenGL的头,opencv的头,glog和protobuf的头等。

        \usr\vc12 文件夹下为针对VS2013开发环境编译的库

        \usr\vc14 文件夹下为针对VS2015开发环境编译的库

        \usr\vc12\x64

        \usr\vc12\x86 在vc12下又有x86和x64版本的库

        这样目录结构就非常明了了,我们在任何环境下调用库时,头文件总是不变的,而库文件则会根据平台不同而不同,于是有了vc12 vc14标准带来的不同,也有x86,x64平台带来的不同,我们将库分别放置在对应目录下。

        现在我们再来介绍两个概念:动态库和静态库。库分为动态库和静态库,在windows下静态链接库的格式为lib,动态链接库的格式为dll。那么这二者有什么区别呢?

        首先,静态链接库lib是预先编译好,在程序生成的链接过程中被调用,生成的程序运行之时不需要lib。

        其次,动态链接库dll是预先编译好,在程序运行过程中由程序调用,而不在程序生成期间起作用。

        \usr\vc12\x64\bin 其中存放的就是dll文件

        \usr\vc12\x64\lib 其中存放的就是lib文件

        在编写程序时,如果你的程序被编译成使用动态库的版本,这就意味着程序交付用户使用时,需要配上相应的dll才能保证程序的正常运行,而规模庞大的程序常常需要依赖很多动态库,常常会使用户配置环境的过程过于复杂。而使用静态库就可以避免这个问题,使用静态库会使自己的程序占用空间变大,而这是我们可以接受的,于是博主编译的库都是静态版本。由于采用了全静态编译,你需要在你的工程中使用静态库,并在Runtime Library作如下设置,否则会报动态库与静态库不匹配等错误。

pa

        关于配置和使,还有一些基本的配置,完成这些基本的配置之后,你就可以轻松地实用这些库了:

        1 在自己的程序中设置采用静态库允许的方式生成代码,如上图所示,如果你使用静态的glog库和glew库,你还需要添加四个预处理宏:

GLEW_STATIC
FREEGLUT_STATIC
GOOGLE_GLOG_DLL_DECL=
GLOG_NO_ABBREVIATED_SEVERITIES

pc

        2 打开配置管理器,然后做出如下修改,主要有三个地方:包含目录,库目录,引用库,如下图:

pz

        在程序代码中使用#pragma comment(lib, “xxx.lib”)来引用库文件,也可以在属性的连接器输入选项中引用库,效果是一样的。

#define __OPEN_CV
#ifdef __OPEN_CV
#include <opencv2\opencv.hpp>
#pragma comment(lib, "opencv_world310.lib")
#else
#include "Scalar.h"
#endif
#include <GL\glew.h>
#include <GL\freeglut.h>
#pragma comment(lib, "glew32s.lib")
#ifdef _DEBUG
#pragma comment(lib, "debug/freeglut_static.lib")
#else
#pragma comment(lib, "release/freeglut_static.lib")
#endif
#include "glog/logging.h"   
#include "io.hpp"//pb接口
#include "acf.pb.h"//预先编译的pb定义
  
#ifdef _DEBUG   
#pragma comment(lib, "debug/libglog_static.lib")   
#pragma comment(lib, "debug/libprotobuf.lib")   
#pragma comment(lib, "debug/libprotoc.lib")   
#else   
#pragma comment(lib, "release/libglog_static.lib")   
#pragma comment(lib, "release/libprotobuf.lib")   
#pragma comment(lib, "release/libprotoc.lib")   
#endif

        使用这种方式配置库,就可一次配置,一直使用了,你就不需要单独为每个库设一个环境变量,单独添加宏了,是不是和linux中调用库一样方便?

        当然,我们可以通过属性表更为便捷的管理本地的内容,但是如果相互之间环境目录不同,那么就可以使用本文中的方式了。

        See You Next Chapter!

 

发表评论