使用Opencv 2.1/2.2 编译64位程序时,编译器内部错误 error c1001

MSDN bug report
Internal compiler error C1001 when compiling OpenCV 2.1/2.2 with C++/CLI 64 bit

解决方案:
(1). 不使用 /clr 选项,或者 #pragma managed 控制 OpenCV 头文件部分,不使其被 CLR 托管;因为可能在编译OpenCV库的时候也是“无公共语言运行时支持”
managed 参考的含义可参考 http://msdn.microsoft.com/zh-cn/library/0adb9zxe
(2). 按 Microsoft 提供的方案,修改 Opencv 中宏定义,具体见上文链接(未测试)

顺便普及编程知识

1. 什么是运行库?  http://baike.baidu.com/view/1032404.htm

程序在运行时所需要的库文件。运行库是一个经过封装的程序模块,对外提供接口,只要知道接口参数就可以自由使用。如果不使用运行库,每个程序中都会包含很多重复的代码,而使用运行库,可以大大缩小编译后的程序的大小。通常运行库是以DLL形式提供的。Delphi和C++ Builder的运行库为.bpl文件,实际还是一个DLL。运行库中一般包括编程时常用的函数,如字符串操作、文件操作、界面等内容。不同的语言所支持的函数通常是不同的,所以使用的库也是完全不同的,这就是为什么有VB运行库、C运行库、Delphi运行库之分的原因。即使都是C++语言,也可能因为提供的函数不同,而使用不同的库。如VC++使用的运行库和C++ Builder就完全不同。

运行库可解决的问题
(1) 如果出现 “由于应用程序配置不正确,应用程序未能启动” 请安装下面的 VC++库:
Microsoft Visual C++ 20XX x86版本 x64版本
  程序如果是64位,则需要X64版本。且程序如果是使用低版本的 Visual C++ ,相应的也要安装 对应的低版本的 Redistributable Package  
(2) 如果出现 “不是有效的win32程序”错误” ,请安装下面的.Framework
Microsoft .NET Framework X.X x86版本 x64版本
  同上,程序如果是64位,则需要X64版本。
(3) 如果出现 “Windows Installer服务错误”,重新安装 Windows Installer
Windows Installer 4.5 官方下载
 说明:正常情况下是有Windows Installer的,个别精简版系统就没有
(4) 游戏时提示缺少DirectX,dxdxxx.dll时候,请安装 DirectX。 说明:DirectX已经包含全系列版本(DX9.0 – DX11)
DirectX End-User Runtimes 官方下载

所有运行库的具体列表可参考上百科链接

附:Microsoft Visual C++ 2010 Redistributable Package (x86) 说明 
The Microsoft Visual C++ 2010 Redistributable Package installs runtime components of Visual C++ Libraries required to run applications developed with Visual C++ on a computer that does not have Visual C++ 2010 installed. 
This package installs runtime components of C Runtime (CRT), Standard C++, ATL, MFC, OpenMP and MSDIA libraries. For more information on supported ways of deployment for Visual C++ applications, click here.

2. 什么是C运行时库(C Runtime CRT) 

但上述两个链接时间较早,查找最新的CRT文件列表
Visual Studio 使用运行时库 : /MD、/MT、/LD(使用运行时库)

3. 什么是公共语言运行时(CLR)

在CLR的控制下运行的代码常常称为托管代码。 但是,在CLR执行开发的源代码之前,需要编译它们。
在.NET中,编译分为两个阶段: 
(1)   把源代码编译为Microsoft中间语言(IL)    (2)   CLR把IL编译为平台专用的代码。 
这种两阶段的编译过程非常重要,因为Microsoft中间语言(托管代码)是提供.NET的许多优点的关键。

十分详细,重要!  Visual C++ 中的  /clr(公共语言运行库编译)编译选项:

4. 公共语言运行时 与 运行时库的关系 

如 /clr 链接内容所述
(1) 当 /clr 生效时,/MD 也将生效(有关更多信息,请参见 /MD、/MT、/LD(使用运行时库))。/MD 确保从标准头 (.h) 文件中选择运行库例程的动态链接的多线程版本。多线程处理是托管编程所必需的,其中一部分原因是 CLR 垃圾回收器将在辅助线程中运行终结器。
(2) 必须使用同一个运行时库编译器选项(/MD 或 /LD)编译传递到给定链接器调用的所有模块。

问题:如果程序是使用 /clr 编译所得,运行时除了 .Net Framework,Redistribution Package是不必须?


这个错误提示表明在编译C++代码,尝试包含OpenCV 4库中的opencv2/opencv.hpp头文件,但是系统找不到指定的文件或路径。这可能是由于以下几个原因: 1. **路径问题**:OpenCV库可能没有正确安装到你的系统路径中,或者你试图包含的头文件所在的路径不正确。检查你的OpenCV安装路径,以及`#include`指令的路径是否指向了正确的目录。 2. **头文件版本**:如果你正在使用的是OpenCV 4,但编译器仍然在寻找OpenCV 3的头文件,那么你需要更新编译命令,确保它指向的是最新版本的头文件。 3. **预处理器定义**:在某些情况下,编译器可能需要特定的预处理器宏(如`OPENCV_VERSION`)来正确识别OpenCV库。确保你在编译前设置了这些定义。 4. **项目配置**:如果你在IDE中编译,检查项目设置是否正确配置了OpenCV库的路径和依赖。 为了解决这个问题,你可以按照以下步骤操作: - **确认路径**:检查`opencv4/opencv2/opencv.hpp`的确切位置,并确保`#include`指令中的路径正确。 - **更新编译命令**:如果头文件已移动,更新你的`#include`指令。 - **添加头文件路径**:在编译选项中添加OpenCV库的包含路径,特别是对于跨目录引用。 - **检查项目配置**:在IDE中,检查并调整项目的库和编译设置。 相关问题: 1. 如何在编译器中指定头文件搜索路径? 2. 如何在不同版本的OpenCV之间正确配置预处理器宏? 3. 如果我是在Linux上遇到这个问题,应该如何检查OpenCV的安装路径?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值