我正在尝试按照官方文档这里,在简单的js文件中加载.dll。
如果我从官方文档中尝试,它会起作用
var ffi = require('ffi-napi');
var libm = ffi.Library('libm', {
'ceil': [ 'double', [ 'double' ] ]
});
libm.ceil(1.5); // 2
// You can also access just functions in the current process by passing a null
var current = ffi.Library(null, {
'atoi': [ 'int', [ 'string' ] ]
});
console.log(current.atoi('1234')); // 1234
但是如果我尝试加载与 dll.js 文件位于同一文件夹中的提供的 .dll - 代码如下所示
const ffi = require('ffi-napi');
const path = require('path');
const file = path.join(__dirname, '/testLibrary');
const pos = ffi.Library(file, {
testFunction: ['void', ['int']],
});
我收到此错误:
MacBook-Pro-3:serialPortTest martin$ node dll.js
/Users/martin/Projects/serialPortTest/node_modules/ffi-napi/lib/dynamic_library.js:75
throw new Error('Dynamic Linking Error: ' + err);
^
Error: Dynamic Linking Error: dlopen(/Users/martin/Projects/serialPortTest/testLibrary.dylib, 0x0002): tried: '/Users/martin/Projects/serialPortTest/testLibrary.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/Users/martin/Projects/serialPortTest/testLibrary.dylib' (no such file), '/Users/martin/Projects/serialPortTest/testLibrary.dylib' (no such file)
at new DynamicLibrary (/Users/martin/Projects/serialPortTest/node_modules/ffi-napi/lib/dynamic_library.js:75:11)
at Object.Library (/Users/martin/Projects/serialPortTest/node_modules/ffi-napi/lib/library.js:47:10)
at Object.<anonymous> (/Users/martin/Projects/serialPortTest/dll.js:6:17)
at Module._compile (node:internal/modules/cjs/loader:1256:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1310:10)
at Module.load (node:internal/modules/cjs/loader:1119:32)
at Module._load (node:internal/modules/cjs/loader:960:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:86:12)
at node:internal/main/run_main_module:23:47
Node.js v18.18.2
我对自动添加的 .dylib 扩展名感到困惑。
我尝试添加 .dll 扩展名,但随后在日志中我可以看到
/Users/martin/Projects/serialPortTest/testLibrary.dll.dylib
。
我尽我所能用stackoverflow/google 搜索它,但没有任何帮助。
如有任何帮助,我们将不胜感激。
简而言之:您无法在 macOS 上加载 Windows DLL,原因有多种,包括但不限于:DLL 可能依赖的 Windows 特定内容、二进制文件格式(Mach-O 与 PE)、CPU DLL 的编译架构(特别是如果您使用的是 Apple Silicon)。
如果您需要针对特定于 Windows 的 DLL 开发解决方案,则需要使用 Windows – 无论是否虚拟化。