[英]Using x64 c++ dll in Unity gives “Is not a valid Win32 application error”
我正在嘗試在 Unity 64 位中使用一些點雲庫 (PCL)功能。 為此,我按照本教程中的說明進行操作, 該教程是關於在 Unity 中使用 OpenCV 庫的。
所以我安裝了PCL 庫 (v1.8, x64) ,我將它鏈接到 Visual Studio C++ 項目並使用它獲得了一個簡單的函數( 庫的入門示例)。
然后我將此項目編譯為 x64 發行版 dll,我將其包含在 Unity 中的 Asset/Plugins 文件夾中,以及 PCL 發行版 dll。
最后,我使用以下幾行統一加載 dll,並使 MySimpleFunction 可用於我的 C# 腳本。
[DllImport("PCLToolsForUnity")]
internal static extern int MySimpleFunction();
問題是,當我運行調用 MySimpleFunction() 的 C# 腳本時,Unity 顯示以下錯誤:
Failed to load 'Assets/Plugins/PCLToolsForUnity.dll' with error '%1 is not a valid Win32 application.
我讀到這可能是由 32 位和 64 位 dll 和應用程序混合引起的,但是我的 Unity 安裝是 64 位以及我包含的 dll(我什至使用dumpbin /headers
命令進行了檢查)。 所以我什至不知道為什么 Unity 期望我的 dll 是一個 Win32 應用程序..
我還檢查了 dll 的路徑中沒有空格,因為我讀到它可能是導致此錯誤的另一個原因。
事先我在一個不使用庫的 c++ 項目中嘗試了所有這些,並且效果很好。 所以它可能是由鏈接庫引起的
關於什么可能導致此錯誤以及如何解決它的任何想法?
我在 x64 機器上工作。
經過更多測試,問題似乎出在我的 DLL 本身上。 當我使用以下命令運行任何函數時: C:\\Windows\\SysWOW64\\rundll32.exe PCLToolsForUnity.dll, testFunction
,我得到與在 Unity 中相同的錯誤: PCLToolsForUnity.dll is not a valid Win32 application
。
我還發現了“破壞”我的 dll 的行。 我導出的功能之一如下:
PCLTOOLSFORUNITY_API int pcdWrite(void)
{
pcl::PointCloud<pcl::PointXYZ> cloud;
// Fill in the cloud data
cloud.width = 5;
cloud.height = 1;
cloud.is_dense = false;
cloud.points.resize(cloud.width * cloud.height);
for (size_t i = 0; i < cloud.points.size(); ++i)
{
cloud.points[i].x = 1024 * rand() / (RAND_MAX + 1.0f);
cloud.points[i].y = 1024 * rand() / (RAND_MAX + 1.0f);
cloud.points[i].z = 1024 * rand() / (RAND_MAX + 1.0f);
}
pcl::io::savePCDFileASCII("test_pcd.pcd", cloud);
std::cerr << "Saved " << cloud.points.size() << " data points to test_pcd.pcd." << std::endl;
for (size_t i = 0; i < cloud.points.size(); ++i)
std::cerr << " " << cloud.points[i].x << " " << cloud.points[i].y << " " << cloud.points[i].z << std::endl;
return (0);
}
我注意到如果我評論pcl::io::savePCDFileASCII("test_pcd.pcd", cloud);
並重新編譯我的dll,然后它就可以運行了,我可以運行dll的函數。 在沒有這一行的情況下編譯 dll 時,我可以從它調用函數並且它正在工作。
我檢查了我鏈接到該項目的庫,對我來說似乎很好,所以仍然不知道我的問題來自哪里。 我希望這些新信息會有所幫助。
多虧了Dependancy Walker,我終於找到了原因。
這實際上是鏈接不良的問題。 PCL 使用 OpenNi 庫和我的變量路徑鏈接到這個庫的 32 位版本而不是 64 位。
對於看到此問題的未來用戶,您還可以通過以下方式找出哪些 .dll 是 x86 與 x64: https : //github.com/lucasg/Dependencies
該工具仍在維護中。
就我而言,此錯誤來自我的 .dll 從操作系統的其他地方獲取了 32 位 Freetype 依賴項。 只需將適當的 Freetype.dll 與我的自定義 .dll 一起拖動即可解決該問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.