[node.js] node.js에서 DLL모듈 불러오기 #4(193, 126, 127 에러에 관해)

이전에 포스팅한대로 따라왔다면 정상적으로 실행이 되어야 할 것이다.

그러나 내가 포스팅한 환경과 다른 환경도 있을 것이고, 똑같이 했는데도 오류가 발생했을 수도 있다.

내가 경험한 세가지 오류에 대해 작성해보려고 한다.

 

먼저 내 node.js 프로젝트의 파일 구성은 이렇게 되어있다.

index.js가 실행될 자바스크립트 파일이고, 그 파일과 같은 위치에 64비트 dll과 32비트 dll이 모두 있다.

Error: Dynamic Linking Error: Win32 error 193

위에 올린 파일 구성을 보고, 아래 소스를 보자.

const ffi = require('ffi')

// dllTest_x64를 dllTest_x86으로 바꿈
const libfactorial = ffi.Library('./dllTest_x86', {
    'factorial': [ 'uint64', [ 'int' ] ]
})

let result = libfactorial.factorial(4);
console.log(result)

이런 상황에서 193 오류가 발생했다.

원인은 설치된 node.js가 64비트용인데, 불러오려는 DLL은 32비트용 DLL을 불러와 오류가 난 것이다.

node.js가 32bit(x86)이라면 DLL도 32bit를, 64bit(x64)라면 DLL도 64bit용으로 불러와야 한다.

Error: Dynamic Linking Error: Win32 error 126
const ffi = require('ffi')

// dllTest_x64를 dllTestx64로 바꿈
const libfactorial = ffi.Library('./dllTestx64', {
    'factorial': [ 'uint64', [ 'int' ] ]
})

let result = libfactorial.factorial(4);
console.log(result)

이 에러는 ffi.Library 함수에 첫번째 인자로 넘겨준 dll파일의 경로에서 DLL파일을 찾지 못했을 때 출력된다.

해당 경로에 dllTestx64라는 DLL파일이 없기 때문에 출력되는 것으로, 경로를 확인하고 맞춰주면 된다.

Error: Dynamic Symbol Retrieval Error: Win32 error 127
const ffi = require('ffi')

// factorial을 factoriall로 바꿈
const libfactorial = ffi.Library('./dllTest_x64', {
    'factoriall': [ 'uint64', [ 'int' ] ]
})

let result = libfactorial.factorial(4);
console.log(result)

이 에러는 DLL 파일은 정상적으로 불러왔으나 해당 DLL에 함수를 찾지 못했을 경우에 출력된다.

단순 오타면 다행이지만, 그렇지 않은 경우라면 DLL 파일에서 원인을 찾아야 한다.

 

1) 헤더파일에 함수가 선언이 안되어 있을 경우

2) .cpp로 작성했는데 extern "C"가 안되어 있을 경우

3) 위 2개가 모두 아니라면 .exe 파일을 만들어 LoadLibrary로 호출이 되는지 확인

 

193이나 126같은 경우문제 해결이 간단한 편이지만 127에러가 발생한다면 조금 머리아플수도 있다.

댓글

Designed by JB FACTORY