当前位置: 首页 > news >正文

各种方法配置 Visual Studio 第三方库

配置第三方库如Opencv,或者软件开发商提供的SDK时,一般需要配置三个文件:

头文件(.h),引入库(.lib)文件(也称“导入库文件”),动态链接库(.dll)文件

下面以度申科技的相机sdk配置为例,简述一下这三个文件的配置方法。

在开发过程中笔者参考了几篇博客,最后在厂商技术人员的帮助下,终于弄清楚了第三方库的配置方法,在此表示感谢。

参考文章:

静态库和动态库的区别,lib文件和dll文件的配置方法_Sean_新浪博客 http://blog.sina.com.cn/s/blog_6dd65c6f0100vveq.html

VS2005 使用/导入lib 、 dll库 - pacewalker的专栏 - CSDN博客 http://blog.csdn.net/pacewalker/article/details/7236701

关于属性表可参考下面文章:

OpenCV在Visual Studio中的属性表配置方法(通用)_百度文库 https://wenku.baidu.com/view/4eb66733ba0d4a7303763a18.html

 

1.配置头文件的方法

1)在属性表中添加附加包含目录绝对路径。

Image 1

2)在属性表中添加附加包含目录相对路径

上图中的路径是SDK的安装路径,即绝对路径,如果想一劳永逸,比如想让这个项目文件夹拷贝到其他没有装SDK的机器上仍能够运行,就把.h文件直接拷贝到项目路径下。这时候就要设置头文件的相对路径,来个例子:

头文件目录如下:

image

属性表中设置的相对路径如下:

image

VS会在项目路径下搜索include文件夹,之后按照配置的相对路径就能找到头文件。

3)在项目头文件中直接用include语句引入,无需配置属性表

绝对路径表示如下:

相对路径表示如下:

#include "../../../library/Visual C++/include/DVPCamera.h"

其中一个"..\"表示一个上一阶目录,有三个"..\"表示当前目录再往前三个目录,所以他的意思就是调用当前目录再往前三个目录下的inclued文件夹中的头文件。头文件实际的路径是

D:\Program Files (x86)\DVP2 SDK\library\Visual C++\include

项目目录为

D:\Program Files (x86)\DVP2 SDK\Sample\VC++\MultipleCamera

因此从MultiCamera向上三层是DVP2 SDK,所以从DVP2 SDK目录下的library中层层向下找到目标头文件。这种写法是因为sdk会被安装到那个目录下是不确定的,但是sdk目录之间的层级关系是固定的。

下面的情况相对路径可表示为(MultiCamera为项目目录):

#include "include/subdirectory/DVPCamera.h"

也可以写作

#include "include\subdirectory\DVPCamera.h"

实际测试发现include语句中‘\’和‘/’没有区别,都能通过编译。

image

2、引入库.lib文件配置方案

与头文件配置类似,引入库也分相对路径和绝对路径。

1)在属性表中添加附加库目录和库文件名称

绝对路径:

image

相对路径:

其中一个"..\"表示一个上一阶目录。

imageimage

添加lib文件名:

在链接器-输入-附加依赖项中添加文件名即可。

image

2)在项目cpp文件中直接用#pragma comment语句引入,无需配置属性表

使用语句添加引入库的好处就是无需配置多个属性表,

不管是debug模式还是release模式,不管是64位还是32位,几行代码通吃。

相对路径:

#ifdef _M_X64
#pragma comment(lib, "../../../VC++/DVPCamera64.lib")
#else
#pragma comment(lib, "../../../VC++/DVPCamera32.lib")
#endif

绝对路径:

#ifdef _M_X64
#pragma comment(lib, "D:/Program Files (x86)/DVP2 SDK/library/Visual C++/lib/x64/DVPCamera64.lib")
#else
#pragma comment(lib, "D:/Program Files (x86)/DVP2 SDK/library/Visual C++/lib/x86/DVPCamera.lib")
#endif

此处注意,直接从地址栏复制的路径中分隔符是‘\’,而comment指令中的分隔符是‘/’,需要做一下修改,否则会报错。

或者也可以用‘\\’,即

#pragma comment(lib, "D:\\Program Files (x86)\\DVP2 SDK\\library\\Visual C++\\lib\\x64\\DVPCamera64.lib") 

image

另外,如果你使用了#pragma comment 语句,记住把属性表里的配置项删除掉。

如果使用了#pragma comment 语句,但是属性表里lib库只给了文件名而配置给库路径,也会报错。

两者是在编译链接时系统都会查找的,任何一个有问题就会报错。

3、动态链接库文件

根据文章:

静态库和动态库的区别,lib文件和dll文件的配置方法_Sean_新浪博客 http://blog.sina.com.cn/s/blog_6dd65c6f0100vveq.html

在程序运行时系统会自动搜索相应的dll文件,搜索的顺序依次分别为:
1、程序的执行目录(exe目录)
例如:F:\VC++\SourceCode\Lesson19\Dll1\Dll1\debug
1、当前目录;
例如:F:\VC++\SourceCode\Lesson19\Dll1\Dll1
2、系统目录;
依次是:C:\WINDOWS\system32;C:\WINDOWS\system;C:\WINDOWS
3、path环境变量中所列出的路径。

最稳妥的方式就是把dll文件放到项目目录Debug或Release文件夹下,而且不能有子目录。下面这种方式就是把dll文件放到子目录下,结果会报错。

image

否则会报错如下:

image

转载于:https://www.cnblogs.com/oucsheep/p/7475555.html

相关文章:

  • BZOJ2303: [Apio2011]方格染色
  • WINFORM TableLayout控件双缓冲防止闪烁
  • Session详解
  • javaAPI1
  • 77 最长公共子序列 (lintcode)
  • struts spring hibernate 三大框架实现基本的增删改查技术
  • 写代码的一些常识
  • warning: assignment from incompatible pointer type [enabled by default]
  • 剑指offer 数字在排序数组中出现的次数
  • 打造vim IDE
  • linux挂载远程windows服务器上的ISO,给内网的服务器安装软件
  • 开源的API集成测试工具 v0.1.2 - 增强体验
  • ActiveMQ笔记——技术点汇总
  • 第三百八十二节,Django+Xadmin打造上线标准的在线教育平台—xadmin管理员详情页面布局,导航图标设置...
  • POJ 3134 - Power Calculus
  • CentOS7简单部署NFS
  • ES2017异步函数现已正式可用
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • js正则,这点儿就够用了
  • LeetCode29.两数相除 JavaScript
  • Linux中的硬链接与软链接
  • Python利用正则抓取网页内容保存到本地
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • tensorflow学习笔记3——MNIST应用篇
  • Transformer-XL: Unleashing the Potential of Attention Models
  • unity如何实现一个固定宽度的orthagraphic相机
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 百度地图API标注+时间轴组件
  • 回顾 Swift 多平台移植进度 #2
  • 京东美团研发面经
  • 三分钟教你同步 Visual Studio Code 设置
  • 探索 JS 中的模块化
  • 怎么将电脑中的声音录制成WAV格式
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • 如何用纯 CSS 创作一个货车 loader
  • ​【已解决】npm install​卡主不动的情况
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​虚拟化系列介绍(十)
  • (+4)2.2UML建模图
  • (Ruby)Ubuntu12.04安装Rails环境
  • (八)Flask之app.route装饰器函数的参数
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (学习日记)2024.01.09
  • (转)平衡树
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET Core 通过 Ef Core 操作 Mysql
  • .NET HttpWebRequest、WebClient、HttpClient
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • @Mapper作用
  • @ResponseBody
  • [ 第一章] JavaScript 简史
  • [Android] Upload package to device fails #2720
  • [C puzzle book] types