我正在try 将Dll导入依赖于OpenCV的Windows.Net/C#应用程序.它是我自己的DLL;我从源代码构建它,并隐式链接到OpenCV"world"DLL,在这个DLL中,OpenCV被构建到一个包含其所有依赖项的DLL中.当我使用here中的预编译二进制文件时,这是可行的.

但是,我需要构建此应用程序的x86版本以及x64,而OpenCV不提供用于x86的预构建二进制文件.我没有try 自己从源代码中构建OpenCV,而是决定try 以vcpkg包的形式获得它.我执行了以下vcpkg命令:

.\vcpkg.exe install opencv[world]:x86-windows

.\vcpkg.exe install opencv[world]:x64-windows

This does give me opencv_world4.dllopencv_world4d.dll 和 associated .lib files but when I attempt to DllImport my DLL with the OpenCV dependency 和 opencv_world4.dll next to my DLL in the working directory, this version of the DLL fails to load with a "not found" exception. If I directly try to LoadLibrary this DLL it returns NULL 和 GetLastError returns 126.

我想知道这个来自vcpkg的DLL是不是真的没有用静态链接的所有依赖项构建,或者这是运行库switch 、/MT vs/MD或其他什么的问题?如果有任何帮助,我很感激.

编辑:使用Dependency Walker查看这一点,很明显vcpkg构建的DLL依赖于各种DLL

dependency walker screenshot

而预置的DLL则不会.因此,我的问题减少到Is there a way to get vcpkg to make a real 100个.为清楚起见,world个功能的vcpkg文档说明如下:

功能名称:World Description:编译为单一包支持 对于OpenCV内部版本依赖:[对象对象]

推荐答案

因此,基本上,[world]特性所做的就是告诉vcpkg将所有OpenCV模块构建到一个world DLL中,但它不会构建它们的依赖项.这不同于在World选项设置为true的情况下从源代码构建OpenCV时发生的情况.

可以让vcpkg使用自定义的三元组来完成它,但是从源代码构建OpenCV更容易.我使用了CMake GUI + Visual Studio,并按照说明in this answer进行操作,但有以下警告:

  • 在成功执行"配置"步骤之后,您需要展开构建项并选中"world"选项的复选框.

  • 为了生成Include标头,您还需要在Visual Studio中构建INSTALL目标.

Csharp相关问答推荐

System.Data.SQLite:判断SQLite数据库是否为空(任何表中至少有一行)

等待限制选项似乎不适用于频道

如何保持主摄像头视角保持一致?

Unity 2D自顶向下弓旋转

Blazor. NET 8—阶段启动配置文件不启动网站VS2022

Blazor Foreach仅渲染最后一种 colored颜色

在静态模式下实例化配置

Blazor在FluentButton onClick事件上设置参数

方法从数据表中只 Select 一个条件?

如何注册类使用多级继承与接口

为什么无法将对象转换为泛型类型

什么类型的对象存储在大对象堆(LOH)中

C#按名称从类获取属性值类型<;t>;,我需要反射吗?

在C#中,是否有与变量DISARD对应的C++类似功能?

当我将`ConcurentDictionary`转换为`IDictionary`时,出现了奇怪的并发行为

两个DateTimeOffset之间的差异返回意外的负值

在C#和HttpClient中使用REST API

在C#中通过Matheval使用自定义公式

我可以阻止类型上的Object.ToString()吗?

无法停止PowerShell中的低级挂钩(c#挂钩)