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版本 |
(2) 如果出现 “不是有效的win32程序”错误” ,请安装下面的.Framework
Microsoft .NET Framework X.X | x86版本 | x64版本 |
(3) 如果出现 “Windows Installer服务错误”,重新安装 Windows Installer
说明:正常情况下是有Windows Installer的,个别精简版系统就没有
(4) 游戏时提示缺少DirectX,dxdxxx.dll时候,请安装 DirectX。 说明:DirectX已经包含全系列版本(DX9.0 – DX11)
Windows Installer 4.5 | 官方下载 |
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.
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的许多优点的关键。
(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是不必须?