windows下编译opencv 3.4.0

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

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

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

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

windows下编译opencv 3.4.0

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

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

windows下编译opencv 3.4.0

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

windows下编译opencv 3.4.0

点击”configure”时提示如下:

windows下编译opencv 3.4.0

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

windows下编译opencv 3.4.0

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

windows下编译opencv 3.4.0

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

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

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

  1. 设置生成文件的目录

windows下编译opencv 3.4.0

可以选中所有需要设置的工程(第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)\

  1. 设置pdb文件的路径

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

windows下编译opencv 3.4.0

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

  1. 设置库目录

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

windows下编译opencv 3.4.0

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

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

windows下编译opencv 3.4.0

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

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

  1. 设置64位标示

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

windows下编译opencv 3.4.0

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

二是x64的标致:

windows下编译opencv 3.4.0

在预处理的定义中加上”_X64″ (这个名字自己定义,没有标准,只用于标示64位的编译,后面会用到这个名字),为了方便查看,加在”

  1. 依赖目录的设置

windows下编译opencv 3.4.0

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

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

  1. 输入库的设置

windows下编译opencv 3.4.0

这个部分设置起来比较麻烦,各个工程都不一样,但对于不同配置,可以一次性设置”所有平台” 的。这个地方的原始设置,主要是基于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。

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

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

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

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

  1. 对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)”进行自动变化的标示才行

Original: https://blog.csdn.net/jszj/article/details/123954930
Author: red-fly
Title: windows下编译opencv 3.4.0

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/704396/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球