UWP에서 DLL을 암시적( Implicitly)으로 link할때 다음과 같은 에러를 만날 수 있다.
The program ‘[xxxx] xxxx.exe’ has exited with code -1073741515 (0xc0000135) ‘A dependent dll was not found’.
프로젝트에 실제 dll파일을 포함시키지 않아서, 정말로 해당 dll이 AppX폴더 밑에 존재하지 않아서 이 에러를 만나는 경우가 대부분이지만, 파일은 멀쩡히 존재하는데 link에 실패하는 경우도 있다.
예를 들어보자.
일부 함수를 순수 어셈블리어(masm으로 작성해서 링크)로 작성한 경우 def파일에 함수명을 적어줘야 외부에서 임포트 할 수 있다.
MegayuchiMathLib_x64_release.dll을 위한 .def파일이다. 여기서
이때 .def파일에 적는 라이브러리 이름이 legacy win32 app에서는 실제 dll파일명과 일치할 필요가 없다. 즉 MegayuchiMathLib_x64_release라고 쓰지 않고 MegayuchiMathLib_x64로 써도 win32 app에선 문제가 없다. debug/release구분 없이 def파일을 한개만 작성하려고 실제로 win32용 dll에선 그렇게 작성해서 사용하곤 했다.
그런데 UWP에선 def파일에 적힌 라이브러리 이름과 실제 dll파일명이 정확히 일치해야한다. 그렇지 않으면 앱실행시 dll파일을 로드하지 못한다. 해당 dll을 찾지 못했다고 에러가 뜨지만 실제로는 파일을 못찾은게 아니고 파일은 찾았으나 섹션정보에 있는 이름이 파일명과 달라서 로드에 실패한 것이다.
명령창에서 dumpbin xxxx.dll /exports를 실행해서 dll 섹션 정보를 확인해보자.
[UWP앱에서 정상적으로 link할 수 있는 경우]
[UWP앱에서 link에 실패하는 경우]
파일명은 MegayuchiMathLib_x64_release.dll이지만 섹션정보에 기록된 파일명은 MegayuchiMathLib_x64.dll 이다. 이 경우 legacy win32 app에선 정상적으로 link가 수행되지만 UWP app에선 실패한다.
이거 찾아내느라 꽤 애먹었다.이건 왜 작동이 다르게 만들고 지랄이야.이거 땜에 어제 잠도 못잤네.
누가 UWP앱을 C++로 만들며, 그 안에서 누가 DLL을 쓰며, 그 DLL안에 누가 어셈블리어로 코딩하며…
이런건 영어로 포스팅 해도 3년에 한번 누가 찾아볼까말까 한 자료라 한국어로는 더더욱 포스팅할 가치도 못느낀다.
그래도 내가 필요할때 찾을수 있도록 메모해둔다.