windows下编译opencv 3.4.0

2023-05-16

为了方便后期的调试,自己动手编译opencv3.4.0,这样有需要的时候还可以自己修改修改源代码。

通常来说,编译32位比较简单,直接用cmake生成编译的工程就行了,但64位就比较麻烦了(实际不是麻烦,是没有找到问题的解决办法而已)

今天完成了64位的编译,所以简单记录下整个编译流程。

先下载源代码,我的目录如下:

下载下来后一个sources目录和3个txt文件 ,第一个build不记得了,应该是后来自己放进去的。这个目录在我的电脑里是比较深的,为了方便,可以放的浅一些,但不能是第一级目录,即sources上面至少应该有一层目录比较好,这样是为了整个opencv的文件都在这个目录里,方便管理。

下载后打开cmake gui工具,选择sources目录,我这里为了方便,目标目录选择了和sources同一个位置的vs2015,这个目录是我自己建立的,当然在cmake gui里选择了vs2015,但目录不存在,会提示自己创建它:

 由于我的这个目录已经是正常的工程目录了,所以它会显示这些内容,第一次它是空的,如下所示,我改成不存在的vs2016的样子:

 点击“configure”时提示如下:

 选择“Yes”,然后又会跳出下面的选择:

由于我安装了vs2015,所以我选择2015,其它的就按照默认的即可,然后点“Finish” ,开始分析整个sources目录,在完成后,中间的框中会显示一些选项,可以根据自己的需要进行选择,当然多数情况下按照默认的即可。在第一次点击“Configure”后,中间的框中通常会出现很多红色的项:

 不需要做什么,只是重新再点一次“Configure”即可,这次很快就可以完成。结束后再点“Generate”开始生成工程文件,任务完成之后,就可以去目录里看下,在指定的目录下,会有解决方案文件OpenCV.sln,双击打开vs2015,由于工程好几十个,所以加载过程会比较慢。

加载完成后,为了方便管理生成的文件,在编译之前先进行一些设置,主要内容是生成的obj文件以及dll、lib文件的位置,如果不修改,它们会分布于每个工程的所在目录,当想拷贝整个目录时,就不方便删除或者去年这些不必要的文件了。工程分为三类,一类是环境检查配置的,这类不用管,一类是生成库的,还有一类是正常的生成dll和库的,当然第3类最多,第二类少一些。

除了第一类,所有的工程都要对目标目录进行设置。为了方便64位的一起设置,先在解决方案的配置管理中,添加x64的平台类型,来源选择从win32的配置进行拷贝,我的64位配置名设置的是x64。下面就是设置项:

1. 设置生成文件的目录

 可以选中所有需要设置的工程(第2、3类),然后在任一被选中的工程上点右键,然后选择“属性”,如上图所示(我只选择了4个工程做为示例),在属性窗口中配置选择“所有配置”,平台选择“所有平台”,然后设置两个路径:

输出目录设置为:$(SolutionDir)bin\$(Platform)\$(Configuration)\
中间目录设置为:$(SolutionDir)compile\$(Platform)\$(Configuration)\$(ProjectName)\

这样,生成的所有dll、lib文件,都在cmake指定的根目录下的bin目录中,编译出来的中间文件obj都在compile目录中。

注意:原始的3rdparty是单独的一个目录,为了在设置后也保持这个单独的目录,对于3rdparty分类下的工程,以上两项的设置后面都再加个3rdparty,如下的样子:

输出目录设置为:$(SolutionDir)bin\$(Platform)\$(Configuration)\3rdparty\
中间目录设置为:$(SolutionDir)compile\$(Platform)\$(Configuration)\3rdparty\$(ProjectName)\

2. 设置pdb文件的路径

同样选中所有需要设置的工程,在属性页中设置如下:

 程序数据库文件名:$(OutDir)$(TargetName).pdb,这样pdb文件就和dll文件在同一个目录中了

3. 设置库目录

这一节对第2、3类的设置不完全一样,对于库类型的工程如下:

 可以选中多个此类工程进行设置,在“库管理器”下的“所有选项”中,设置“输出文件”为 $(OutDir)$(TargetName)$(TargetExt)。

对于第3类,则设置如下:

在“链接器” 下的“高级”中,设置“导入库”为 $(OutDir)$(TargetName).lib

以上3类设置,不区分32位和64位,也不区分debug还是release,所以设置比较方便,只要选择所有工程,并选中所有配置和平台,就能一次性设置好。

4. 设置64位标示

有两个地方需要设置,一是machine类型:

 由于64位的配置是从32位拷贝过来的,所以这里的设置和32位一样,在编译时和64位的设置冲突导致无法编译。同样选样同一类的所有工程,在属性窗口中选择“所有配置”,平台切记选中“x64”,然后把“链接器”(对于第2类,则是“库管理器”)->"命令行"中,其他选项框中的“/machine:x86”删除掉

二是x64的标致:

在预处理的定义中加上“_X64” (这个名字自己定义,没有标准,只用于标示64位的编译,后面会用到这个名字),为了方便查看,加在“<不同选项>”之前比较好。

5. 依赖目录的设置

 为了方便,可以选中所有同一类型的工程一次性设置,原始设置是不同的工程可能有不同的依赖,所以设置的也不一样,这里就不管它了,把所有工程都设置上,这样用到的工程就用,用不到的也不会产生负作用。

附加库目录设置为:$(OutDir);$(OutDir)3rdparty\;%(AdditionalLibraryDirectories)

6. 输入库的设置

这个部分设置起来比较麻烦,各个工程都不一样,但对于不同配置,可以一次性设置“所有平台” 的。这个地方的原始设置,主要是基于cmake生成的目录结构,所以它都带了相对路径,现在就是要把这些相对路径全部去掉,但是对于3rdparty下的那些项,则不能简单地去掉路径,这有两个文件,一个是ippiw.lib,可以把路径去掉,也可以保留3rdparty,比如 3rdparty\ippiw.lib,一个是ippicvmt.lib,其形式必需是ippicv\ippicv_win\lib\ia32\ippicvmt.lib,或者前面加个3rdparty,如3rdparty\ippicv\ippicv_win\lib\ia32\ippicvmt.lib。依赖的所有本opencv目录下的lib文件,除了ippicvmt.lib不区分debug和release,其它lib文件都区分,debug的以d结尾,比如ippiwd.lib,release版本的为ippiw.lib。对于3rdparty下的,可以带3rdparty,也可以不带3rdparty,是国类依赖的目录设置包含了3rdparty,所以根据上面依赖的目录设置,所有的3rdparty都可以去掉,但我这里大部分工程都保留了3rdparty,只有2个最开始设置的工程没有保留,因为一开始意识到依赖目录的设置包含了3rdparty,而后来设置时,为了对齐,就全部保留了3rdparty。

7. 依赖的obj文件的路径修改

由于修改了中间文件的生成路径,所这个部分也需要修改。不太记录有哪几个工程涉及到,大概有两三个工程吧。在依据上面的修改完成后,编译32位的debug版,在生成输出窗口中提示有找不到obj文件的工程,找到它,用文本文件编辑器打开它进行修改,一个工程有两个文件,分别为.vcxproj、.vcxproj.filters,打开后搜索.obj,如下为我修改后的一个obj文件:

<Object Include="$(IntDir)..\opencv_core_SSE4_1\convert.sse4_1.obj" />

修改之前它是绝对路径,类似下面这样:

<Object Include="E:\opencv\opencv-3.4.0\vs2015\modul\core\opencv_core_SSE4_1.dir\$(Configration)\convert.sse4_1.obj" />

这里要把工程名之前的部分 E:\opencv\opencv-3.4.0\vs2015\modul\core 换成 $(IntDir)..,去掉后面的 .dir\$(Configration) ,这样就换成了相对路径,并且和修改后的中间文件输出路径想一致了

8. 对64位下的ippiw进行屏蔽

到此,32位的可以正常编译,但64位的还是编译不过,它会提示有个和ippiw有关的函数调用无法链接。刚开始我尝试去寻找ippiw的64位版本,但找了一大圈也没有找到,后来到网上查看编译opencv 64位的文章,提到用cmake配置64位的就可以编译通过。于是我也如法炮制,在cmake选择编译工具那一步时,平台我选“X64”,最后生成工程后编译确实可以成功,然后查看和自己配置的64位编译不过的地方的差异,终于找到了问题所在的位置。

在cmake指定的根目录中,即opencv解决方案所在的目录中,有个 cvconfig.h 文件,通过对比32位和64位目录下的两个,发现在64位下,

#define HAVE_IPP
#define HAVE_IPP_ICV
#define HAVE_IPP_IW

这三行被注释掉了。于是自己修改这个文件如下:

/* Intel Integrated Performance Primitives */
#ifndef _X64
#define HAVE_IPP
#define HAVE_IPP_ICV
#define HAVE_IPP_IW
#endif

前面添加了 _X64 预定义的判断,这个预定义,就是上面预定义设置里添加的那一个。

这样修改后,32位、64位的全都可以编译通过了。

附加说明

以上的设置,主要工作是为了方便文件管理,修改了生成的目录。如果不修改路径,则只需要修改和 _X64 有关的两个设置即可。当然对于 obj 文件的依赖路径可能也需要修改,因为它默认的是32位的路径,对于64位的,需要进行修改,但由于32位和64位是一起的,所以不能修改成硬路径,其中必需带有“$(Platform)”进行自动变化的标示才行

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

windows下编译opencv 3.4.0 的相关文章

随机推荐

  • sql的datetime 数据类型

    sql的datetime 格式如 2018 6 13 13 02 23 但是有时候我们不需要这么多内容 xff0c 比如说我们只需要匹配日期 xff0c 不管具体的时刻 这时候我们就可以使用 DATE 函数 面对如上数据 xff0c 想要获
  • 【网段】【vlan】【广播域】关于网段,vlan和广播域的关系的个人理解

    广播域是一个二层概念 xff0c 所有能够接收到同一个广播的设备处于同一广播域 而所有的三层以下的设备 xff08 不包括第三层 xff09 都是不能隔离广播的 xff0c 所以所有由交换机 xff0c 网桥 xff0c 集线器连接起来的设
  • git 创建远程库

    首先是git的配置 git config global user name 34 your name 34 git config global user email 34 your mail 34 这两个配置信息是用来记录你的git操作 x
  • python 创建二维列表的方法

    使用python创建二维列表有以下两种方式 xff1a 1 列表复制法 xff1a a 61 0 width height 但是这种方法会导致如下问题 xff1a gt gt gt a 61 0 3 4 gt gt gt a 0 0 0 0
  • 各种接插头名称汇总

    杜邦线插头 JST接线端子 SH1 0MX1 25ZH1 5PH2 0HY2 0XH2 54贴片座子 T型插头 XT60型插头 SM插头 未完待续
  • GA-B85M-D3V PLUS 1150安装win10后的蓝屏问题汇总

    通过windbg来定位出错的sys文件 下面是安装技嘉官方驱动后依然频繁出现的蓝屏 尝试方案fltmgr sys sfc scannow chkdsk c f r dxgmms2 syssystem service exception dx
  • 超声波风速风向传感器

    OSA 1F1 超声波风速风向传感器 1 概述 OSA 1F1超声波风速风向传感器是一款迷你型全数字化传感器 xff0c 高度集成超声波风速 风向传感器 xff0c 体积小巧 xff0c 集成度高 xff0c 质量轻 xff0c 坚固耐用
  • Loggernet软件新手入门(一)

    loggernet软件新手入门 xff08 一 xff09 安装与简单操作 一 xff0e 软件及驱动安装安装 1 1 打开软件安装包 xff0c 点击 exe应用程序图标 xff0c 然后在弹出的对话框中 xff0c 选择 Install
  • Loggernet软件新手入门(二)

    一 xff0e 创建一个程序 在loggernet软件中 xff0c 创建一个程序有两种方式 xff1a Short Cut以及CRBasic Editor xff0c 这两种方式都可以在Program目录下找到 1 1Short Cut
  • PC200W-简版loggernet软件

    一 xff0e 解压缩PC200W文件夹 xff0c 双击下图图标 xff0c 可以打开PC200W 二 xff0e 创建一个连接 打开软件后 xff0c 会弹出一个关于创建连接的对话框 xff0c 如果没有弹出 xff0c 可以在Netw
  • 示例一:CR300接CS655

    Public PTemp Batt volt Public CS655 3 Alias CS655 1 61 vwc Alias CS655 2 61 ec Alias CS655 3 61 T Units vwc 61 Units ec
  • 日本原装COM 3600F专业型空气负离子检测仪 --CR1000采集

    Public PTemp Batt volt Public instring string As String 36 Public Num spilt 3 As String 3 Alias Num spilt 1 61 ION FM Pu
  • java FlowLayout示例

    java FlowLayout示例 xff1a import java awt FlowLayout import javax swing JLabel import javax swing WindowConstants import j
  • Get 一个显示界面,与数采串口通信

    程序第一步 xff1a 显示 数据来源 xff0c CR1000数据采集器 xff0c 5秒采集并存储上传 第二步 xff1a 存储 TXT文档存储 xff0c 逗号分隔 xff0c 每月创建一个新的文件 xff0c 可以另存为excel文
  • UART通信协议

    UART通信协议 一 UART是什么 xff1f 1 同步串口通信 vs 异步串口通信2 串行通信 二 通信协议三 工作原理四 特点 一 UART是什么 xff1f 通用异步收发传输器 xff08 Universal Asynchronou
  • win10右下角的通知区域

    属性 gt 通知和操作 gt 选择在任务栏上显示哪些图标 gt
  • UART一对多通信的方法

    通常 xff0c uart为单对单通信 xff0c 当用到一对多时可以用RS485 然而有时候我们MCU的uart口只剩一个 xff0c 又要接多个uart的外围芯片 xff0c 这时如果转成RS485需要加多个485收发器 xff0c 成
  • 全网最全的 postman 工具使用教程

    正文如下 xff0c 如果觉得有用欢迎点赞 关注 postman是一款支持http协议的接口调试与测试工具 xff0c 其主要特点就是功能强大 xff0c 使用简单且易用性好 无论是开发人员进行接口调试 xff0c 还是测试人员做接口测试
  • 星际争霸1终于可以在win10上运行了

    win7的时候 xff0c 星际争霸1就不能运行 xff0c 只好装了个虚拟机 xff0c 在虚拟机里玩 刚刚更新到了win10 xff0c 总觉得在虚拟机里玩不是个事 xff0c 就去网上搜索 xff0c 终于发现了办法 在 StarCr
  • windows下编译opencv 3.4.0

    为了方便后期的调试 xff0c 自己动手编译opencv3 4 0 xff0c 这样有需要的时候还可以自己修改修改源代码 通常来说 xff0c 编译32位比较简单 xff0c 直接用cmake生成编译的工程就行了 xff0c 但64位就比较