对OpenCV学习笔记(1)遗留问题的思考
上篇的最后,留下了一下疑问,为什么明明是在X64系统下,却不能使用“*\opencv\build\x64\vc11”下的库,而只能用“*\opencv\build\x86\vc11”下的库?
今天思考了一下,可能与以下几点有关:
1.操作系统是64位的,开发环境是64位的,所选编译器是否是64位的?VS2012下面至少有两个可选的编译器,一个是win32编译器,一个是x64编译器(在某些安装选项下甚至可能未安装x64编译器,请安装之),我们在配置的时候选用的是哪一个编译器?
2.如果已选择64位编译器,在链接器的高级选项中,是否设置“目标计算机”为“x64”架构,请看图。
3.所使用的opencv库(*.dll,*.lib)是用32位系统编译的还是用64位系统编译的?如果断定所使用的库是32位的,而opencv的目录下又找不到64位的库的话(最新的2.4.7版貌似分别编译了32位版和64位版并分别放置于*\build\x86和*\build\x64下,老版本的未知),则需要自己重新编译64位的库。注意环境变量的设置,这将直接决定你选用的库是什么版本的。
---------------------------------------------------------------------------------------------------------------------
现在,我的opencv2.4.7在win8 64bit+VS2012 64bit下使用64位库(\x64\vc11)已经可以完美运行了,将方法记录如下,算是对上篇的补充:
1.打开“配置管理器”,点击“平台”旁边的箭头,选择“新建”,如果你已经安装了64位的编译器,那么在弹出的对话框中就可以创建新的“x64”平台,创建完成后,将“活动解决方案平台”选为“x64”。
2.打开“属性管理器”,可以看到其中多了两个新的属性页,
展开“Debug|Win32”和“Debug|x64”,比较他们的第一个属性表(称之为全局属性表),可以看到一个标明了“Win32”,一个标明了“x64”。在这里,我们采用Global Method,对“Microsoft.Cpp.x64.user”按照上篇设置"Microsoft.Cpp.Win32.user"的方法进行设置。
3.双击“Microsoft.Cpp.x64.user”,弹出属性页,三步走设置其属性:“附加包含目录”-->“附加库目录”-->“附加依赖项”。依赖项的具体内容与上篇一致。
4.更改环境变量“OPENCV_DIR”的值为“*\opencv\build\x64\vc11”,“*”仍然是要替换为opencv的实际安装目录。
5.选择调试平台为“x64”,finished!
后记:
现在返回去思考,为什么一开始无法使用“*\opencv\build\x64\vc11”下的库呢?
主要原因就是一开始我选择的调试平台为“Win32”(从我所配置的属性表名称“Microsoft.Cpp.Win32.user”就可以看出来),所以我一直在用32位的编译器引用64位的外部库,因此就一直报“无法解析的外部符号”,当我换了32位的外部库(“*\opencv\build\x86\vc11”下的)后马上就编译成功了。因此,其他的配置都是没有问题的,环境变量的设置也是没有问题的,真正的问题在于,如果要使用64位的库就必须要调用64位的编译器;如果要使用32位的编译器编译,就只能引用32位的外部库。注意一一对应。