在 Unity 中使用 x64 c++ dll 可以"Is not a valid Win32 application error"
Using x64 c++ dll in Unity gives "Is not a valid Win32 application error"
我想做的
我正在尝试使用Unity 64bits中的某些点云库(PCL)功能。为此,我像本教程中的解释一样进行,该教程涉及使用Unity的OpenCV库。
我做了什么以及我得到的问题
因此,我安装了PCL库(V1.8,X64),将其链接到Visual Studio C 项目,并使用它获得了一个简单的功能(库的入门示例)。
然后,我将该项目编译为X64版本的DLL,我包含在资产/插件文件夹中的Unity以及PCL Release DLL中。
最后,我使用以下几行将DLL加载为Unity,并使MySimplefunction可用于C#脚本。
[DllImport("PCLToolsForUnity")]
internal static extern int MySimpleFunction();
问题是,当我运行C#脚本调用mySimpleFunction()时,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:WindowsSysWOW64rundll32.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时,我可以从中调用功能,并且可以正常工作。
我检查了我链接到该项目的库,对我来说似乎还不错,所以仍然不知道我的问题从何而来。我希望这些新信息会有所帮助。
我终于找到了这一点的原因。
这实际上是链接不良的问题。PCL使用OpenNi库,我的变量路径链接到该库的32位版本,而不是64位。
对于看到此问题的未来用户,您还可以发现哪个.dll是x86 vs x64,with with:https://github.com/lucasg/dependendencies
此工具仍在维护中。
在我的情况下,此错误来自我的.dll从操作系统其他地方抓取32位freetype依赖性。只需使用我的自定义.dll解决该问题。
- Is !NaN not a NaN?
- Directx 11 - CompileFromFile() is not compiling
- Centos7 g++ "to_string is not in a member of std"
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- reference_wrapper导致"incomplete type is not allowed"
- 结构中的错误"Incomplete type is not allowed"
- 这在C++ "It does not own the underlying data, and so is cheap to copy or assign"中意味着什么
- "Called Object Type is Not a Function or Pointer" 与 typedef 和类
- 无法创建 DLL:获取 DLL "is not a valid Win32 application"
- Atom gpp编译器给出"'C:UsersadminUser' is not recognized as an internal or..."错误
- 当我编译XG-Bosst时,出现错误"error: 'Split' is not a member of 'xgboost::common' ……"
- C++ DLL 运行时错误"abc.dll is not a valid WIN32 application" 。请帮助解决这个问题
- QString::utf16(): Is it UB or not?
- 如何修复 eigen3 中的'non-type template argument is not a constant expression'?
- 我的代码应该接受一个数字,并返回字母等级或"Grade is not valid"但 else 语句不起作用
- 如何修复此错误"the value of 'x1' is not usable in a constant expression"?static_assert
- 加载安全区图像"A device attached to the system is not functioning"
- 巴泽尔中的错误"name 'new_local_repository' is not defined"
- 如何修复 SDL2 "GLSL 3.30 is not supported"错误
- 函数模板(它是类模板的成员)的显式专用化会产生"partial specialization is not allowed"错误,为什么?