簡體   English   中英

在 Unity 中使用 x64 c++ dll 會出現“不是有效的 Win32 應用程序錯誤”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM