您的位置:首页 > 编程语言 > Qt开发

win7 + VS2010配置opencv、boost、QT、QT-addin、CGAL

2016-01-14 14:35 501 查看
步骤一: 安装VS2010

错误:LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

发生情况:VS成功安装之后,新建C++新项目,代码如下,运行调试

#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
cout<<"VS testing..."<<endl;
system("PAUSE");
return 0;
}

原因说明:当安装VS2012之后,原来的.NET 4.0会被替换为.NET 4.5。卸载VS2012时,不会恢复.NET 4.0。

当VS2012安装后,VS2010的cvtres.exe就无法使用了。如果你的PATH环境变量中VS2010的工具路径第一个出现,而且链接器需要将.res文件转换为COFF 对象格式,就会导致LNK1123错误。
当VS生成PE文件头时,使用的cvtres.exe版本错误,不能与当前的.NET平台兼容。

解决方案:当前系统中存在两个cvtres.exe文件,版本不同。让VS2010使用.NET 4.5的cvtres.exe程序。
具体步骤:
重命名或删除:(vs2010安装的位置)C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\cvtres.exe
这样C:\Windows\Microsoft.NET\Framework\v4.0.30319 (.NET 4.5)中的cvtres.exe文件就可以被VS2010使用。

解决结果:调试成功、运行成功、成功显示“VS testing...”

步骤二:安装opencv及在VS2010中的配置

1. 编译好的opencv包直接放在一个位置上,比如:C:\Program Files (x86)\下的文件夹中(或者可以用CMake来编译opencv源代码包,选择VS2010编译器编译,这样opencv的代码最后才能也用在VS项目中不出现错误)

2. 对应VS2010的相应opencv编译过的代码在C:\Program Files (x86)\opencv\build\x86\vc10中,里面分别有bin、lib、staticlib文件夹,其中bin所在的文件夹路径需要加入到计算机的系统环境变量中去,将C:\Program Files (x86)\opencv\build\x86\vc10\bin加入到用户变量和系统变量的path中(用户变量表示当年用户可以进行操作使用,系统变量对所有用户都适用)

3. VC++目录配置

可执行文件目录:C:\Program Files (x86)\opencv\build\x86\vc10\bin
包含目录:C:\Program Files (x86)\opencv\build\include;C:\Program Files (x86)\opencv\build\include\opencv;C:\Program Files (x86)\opencv\build\include\opencv2;
库目录:C:\Program Files (x86)\opencv\build\x86\vc10\lib;C:\Program Files (x86)\opencv\build\x86\vc10\staticlib;

4. 链接器->输入->依赖项配置

加入:
opencv_calib3d231d.lib;opencv_contrib231d.lib;opencv_core231d.lib;opencv_features2d231d.lib;opencv_flann231d.lib;opencv_gpu231d.lib;opencv_highgui231d.lib;opencv_imgproc231d.lib;opencv_legacy231d.lib;opencv_ml231d.lib;opencv_objdetect231d.lib;opencv_ts231d.lib;opencv_video231d.lib;%(AdditionalDependencies)

注意:
a)以上的%(AdditionalDependencies)不能被去除,否则项目不能成功调试,而且这种错误又很难找到。
b)在附加依赖项的窗口里,保持“从父级或项目默认设置继承”的选项被选中,否则项目可能不能成功调试或运行,因为VS2010本身也会继承一些系统的类。

问题:testVS.exe 中的 0x651f7cbe (msvcp90d.dll) 处有未经处理的异常: 0xC0000005: 读取位置 0x00000024 时发生访问冲突

出现情况:运行以下代码,运行到 cout<<a; 位置就会跳入ostream文件中,只是错误

#include "stdafx.h"
#include <iostream>
#include <cv.h>
using namespace std;
using namespace cv;

int _tmain(int argc, _TCHAR* argv[])
{
Mat a(3,4,CV_64FC1,Scalar(1));
cout<<a;
cout<<"VS testing..."<<endl;
system("PAUSE");
return 0;
}

原因说明:#include <iostream>调用了ostream文件,在运行出错过程中发现,该ostream文件所在的位置是\Microsoft
Visual Studio 9.0\VC\include目录,而不是\Microsoft Visual Studio 10.0\VC\include
这两个文件夹中都包含了ostream文件。
在VS2008中的ostream中应该是没有包含对opencv中Mat结构的“cout<<”输出流的重写/定义,所以不能直接用 “cout<<a;”来输出矩阵a;而VS2010可以成功地识别这行代码,成功输出。
VS2008的安装目录\Microsoft Visual Studio 9.0\VC\include下面就包含了标准库的头文件。ostream也被包含。
同样地,VS2010的安装目录\Microsoft Visual Studio 10.0\VC\include下也包含了类似的标准库文件。

解决方案:
检查环境变量,其中用户变量里有
path->
C:\Users\apple\Desktop\opencv\install\install\bin;C:\Program Files (x86)\opencv\build\x86\vc10\bin

path2->

C:\Program Files (x86)\opencv\build\common\tbb\intel64\vc9

将path2中的输入更改为 C:\Program Files (x86)\opencv\build\common\tbb\intel64\vc10,注意一定要进行用户注销或者重新启动,这样才可以刷新环境变量的输入。

解决结果:
能够成功运行并输出Mat a



以上说明opencv配置成功,可以使用opencv

步骤三:安装boost

1. 将boost源文件包放在一个位置(boost源文件大概是300M+左右,编译生成和建立boost库之后,会变成几个G,因为多了很多lib和dll文件)

2. 使用VS2010命令编译器
运行cmd
输入 cd\ 退到根目录

输入 cd Program Files (x86)

输入 cd Microsoft Visual Studio 10.0
输入 cd VC\bin

以上表示进入文件夹C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin

输入 vcvars32.bat
表示用VS2010编译器来开始编译

3. cmd再次退回到根目录,进入boost所在的位置
输入 cd \
输入 cd Program Files (x86)\boost\boost_1_57_vs2010
输入 bootstrap
显示 Builiding Boost.Build engine开始运行……

4. 以上在boost_1_57_vs2010文件夹中生成一个b2.exe,运行b2.exe
输入 b2 link=static,shared threading=single,multi variant=debug,release
多了stage文件夹和子文件夹lib,存储着编译的dll、lib文件等

5. 添加 C:\Program Files (x86)\boost\boost_1_57_vs2010 到系统变量中,可以随便取一个变量名BOOST_ROOT,再设置值为路径C:\Program Files (x86)\boost\boost_1_57_vs2010

6. 配置VS:打开项目的工具-->选项-->项目与解决方案-->VC++目录
库文件 --> C:\Program Files (x86)\boost\boost_1_57_vs2010\stage\lib
包含文件 --> C:\Program Files (x86)\boost\boost_1_57_vs2010\boost

步骤四:安装QT和QT-addin

1. 安装QT5.5.1(对应VS2010),安装路径不能包括空格和中文

2. 安装QT-addin1.2.2(对应VS2008、2010、2012)

3. 设置系统环境变量:增加 C:\QT\Qt5.5.1\5.5\msvc2010\bin 的环境变量

4. 配置VS:打开项目的工具-->选项-->项目与解决方案-->VC++目录

可执行文件 C:\QT\Qt5.5.1\5.5\msvc2010\bin

包含文件 C:\QT\Qt5.5.1\5.5\msvc2010\include;C:\QT\Qt5.5.1\5.5\msvc2010\include\QtGui;C:\QT\Qt5.5.1\5.5\msvc2010\include\QtCore

5. 建立Qt插件:
选择菜单上的“QT”选项- >“Launch Designer”, 启动designer : 放入一个“label”,内容写为:helloQT。然后保存为Hello.ui,该文件被放在了项目文件夹中,再将它添加到VS项目的源文件。

6. 编译生成HelloUi.h
将以上的复制到 C:\QT\Qt5.5.1\5.5\msvc2010\bin 中去,这个文件夹中存在一个uic.exe(不能将),然后运行cmd,输入:uic xxx.ui -o xxx.h

7. 加入程序代码:

----1----
问题:“NO default Qt version found。Please check Qt Visual Studio Add-in settings”.

出现情况:VS项目中点击 Qt->Launch Designer 时提示

解决方案:Qt->Qt Option->增加Qt中bin所在位置的文件夹 C:\QT\Qt5.5.1\5.5\msvc2010

解决结果:可以成功点击Qt->Launch Designer弹出界面

-----2-----

问题:

1>c:\users\apple\documents\visual studio 2010\projects\testvs\testvs\testvs.cpp(20): fatal error C1083: 无法打开包括文件:“QtGui/QApplication”: No such file or directory

原因分析:新版Qt5.5.1将QApplication放置在Qt的include中的QtWidget包中

解决方案:去除QtGui/QApplication中的QtGui,直接写QApplication,相关include目录加入include/QtWidget

-----3-----

问题:error C2664: “QApplication::QApplication(int &,char **,int)”: 不能将参数 2 从“_TCHAR *[]”转换为“char **”

解决方案:项目->属性->常规:
字符集:Unicode字符集->多字符集

-----4-----

问题:

error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: virtual __thiscall QApplication::~QApplication(void)" (__imp_??1QApplication@@UAE@XZ),该符号在函数 _main 中被引用

原因分析:Qt相关的依赖项未被加入到项目中

解决方案:项目->属性->链接器->输入->依赖项:

解决结果:调试成功

-----5-----

问题:无法启动此程序,因为计算机中丢失Qt5Cored.dll

原因分析:Qt相关的依赖项未被加入到项目中

解决方案:项目->属性->链接器->
PATH=C:\QT\Qt5.5.1\5.5\msvc2010\bin;$(TargetDir)\DLLS

注意一定要加上上面的PATH=....$(TargetDir)\DLLS语句,直接在调试->环境中输入C:\QT\Qt5.5.1\5.5\msvc2010\bin;不能运行成功

解决结果:调试并且运行成功,跳出QWindow小窗,命令提示符显示一些有关参数

步骤五:安装并编译CGAL

(可以直接拷贝其他电脑上VS2010编译好的CGAL文件夹)

1. CMake
"Where is the source code" 和"Where to build the binaries" 中指定编译的CGAL文件夹
configure
选择Visual Studio 10 2010,点击Finish
点击Generate

2.

完成之后在CGAL文件夹里一个名字叫CGAL的解决方案被创建,打开,分别在Debug和Release模式下编译ALL_BUILD
所有的CGAL库都会在在该文件夹/lib文件夹中

3. VS配置

可执行文件 --> C:\Program Files (x86)\CGAL\CGAL4.5_vs2010\bin

库文件 --> C:\Program Files (x86)\CGAL\CGAL4.5_vs2010\lib; C:\Program Files (x86)\CGAL\CGAL4.5_vs2010\auxiliary\gmp\lib;
包含文件 --> C:\Program Files (x86)\CGAL\CGAL4.5_vs2010\auxiliary\gmp\include; C:\Program Files (x86)\CGAL\CGAL4.5_vs2010\include;

----------1----------
问题:

1>msvcprtd.lib(MSVCP100D.dll) : error LNK2005: "public: class std::basic_ostream<char,struct std::char_traits<char> > & __thiscall std::basic_ostream<char,struct std::char_traits<char> >::operator<<(double)" (??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@N@Z) 已经在 opencv_contrib231d.lib(spinimages.obj) 中定义

原因说明:
这种情况主要是C运行期函数库和MFC的库冲突造成的。具体的办法就是将那个提示出错的库放到另外一个库的前面。

解决方案:
调节CGAL、boost、QT、opencv配置的顺序,项目->属性->VC++目录,可执行文件目录、包含目录、引用目录、库目录、源目录:按照CGAL、QT、boost、opencv顺序排列输入。

解决结果:
调试不再出现 error LNK2005: "public: ×××已经在×××中定义,调试成功

----------2------------
问题:无法启动此程序,因为计算机中丢失CGAL-vc100-mt-4.5.dll

出现情况:调试成功,运行后跳出窗口

解决方案:点击 工程属性-->配置属性-->调试-->环境
设置值为“PATH=<dll路径>;$(TargetDir)\DLLS”,比如 PATH=C:\QT\4.7.4\bin;C:\Program Files (x86)\CGAL\4.5\bin;C:\Program Files (x86)\CGAL\4.5\auxiliary\gmp\lib;C:\Program Files (x86)\boost\boost_1_57_0\stage\lib;$(TargetDir)\DLLS”。

boost、QT、CGAL对应的dll通常可能存在于:
1. boost:<安装路径>/stage/lib(里面存在boost_system-vc90-mt-gd-1_57.dll, boost_chrono-vc90-mt-1_57.dll, boost_thread-vc90-mt-gd-1_57.dll等);
2. Qt:<安装路径>/bin(里面存在QtCore4.dll, QtCored4.dll, QtGui4.dll, QtGuid4.dll, QtOpenGL4.dll等);
3. CGAL:<安装路径>/bin (里面存在CGAL_Qt4-vc90-mt-gd-4.5.dll, CGAL_ImageIO-vc90-mt-4.5.dll等) <安装路径>/auxiliary/gmp/lib (里面存在libgmp-10.dll)
4. opencv:<安装路径>/bin (里面存在opencv_calib231d.dll)

解决结果:
调试成功,程序成功运行!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: