[출처] error LNK2019: unresolved external symbol "__declspec(dllimport)|작성자 과유불급



DLL을 이용한 프로그램을 하다보면 초보적인 실수로 위와 같은 에러메시지가 나오는 경우가 있다. 이는 DLL에서 export한 함수를 사용하려고 하는 응용프로그램에서 호출하는 경우 link를 할 수 없다는 에러인데, 이것에는 여러가지 경우가 있을 수 있다.


1. DLL코드에서 외부로 export하려고 하는 함수에 대한 처리를 제대로 하지 않은 경우

예를 들면 extern "C" _declspec(dllexport) int SetSensInfoEntry(set_si_args_t si_t); 와 같은 함수가 DLL에서 정의되어 있어야 하는데 이에 대한 처리가 정상적으로 되지 않은 경우(함수 스펠링 오타, 또는 대소문자 오류,...) 일단 이러한 문제를 체크해봐야 한다.


2. 1번과 반대로 DLL에서 export한 함수를 사용하려고 하는 경우에도 extern "C" __declspec(dllimport) int SetSensInfoEntry(set_si_args_t); 와 같이 정상적으로 정의해서 사용해야 하는데 이에 대한 처리가 제대로 되지 않은 경우


3. EVC(Embedded Visual C++)에서 위 DLL의 export한 함수를 사용하기 위한 코드를 컴파일하기 위해 필요한 .lib 파일을 정상적으로 link하지 않은 경우

사용자 삽입 이미지


즉 위 그림과 같이 object/library modules: 부분에 사용하려고 하는 .lib 파일을 기술하고(이 경우에는 usbd.lib) 정상적으로 컴파일을 해야 한다.


4. 위의 방법으로도 에러가 발생한다면, .lib 파일이 정상적으로 생성되었는지. 즉, export하려고 하는 함수가 제대로 export되어 있는지를 확인해봐야 한다. 그 방법은 아래와 같은 도스창(cmd)에서

사용자 삽입 이미지


dumpbin 유틸리티를 통해 확인해보는 방법이다. dumpbin의 실행옵션중에보면 /exports 옵션이 있는데 이 옵션을 이용하면 lib에서 export한 함수들의 리스트를 볼 수 있다. 이렇게 하여 최종적으로 생성된 .lib파일에서 export하려고 하는 함수가 제대로 export되었는지를 확인해야 한다.


5. 이러한 과정을 통해서도 에러가 발생한다면 마지막으로 의심해봐야 하는 것은 생성된 .lib 파일이 정말로 DLL 컴파일과정에서 생성된 .lib파일인지를 확인해봐야 한다. 즉, 이전에 있던 .lib 파일을 지우고 컴파일을 해서 생성이되고 생성날짜/시간 등을 확인해봐야 한다. 즉, .dll파일과 .lib 파일이 동시에 생성되야 하고 이 파일들이 생성날짜/시간이 거의 동일(같거나, 초단위의 오차정도)해야 한다. 그리고, 이렇게 생성된 파일을 응용프로그램 컴파일을 위한 디렉토리로 옮기는(copy)경우가 있는 경우에는 이 파일들의 일관성(똑 같은 파일이냐?)도 검사를 해주어야 한다.


6. DLL을 EVC에서 생성하고 응용프로그램을 EVC에서 개발하는 경우가 아니라, 만일 DLL은 플랫폼 빌더에서 생성하고 EVC에서 응용프로그램을 개발하여 이를 이용하는 경우에는 좀 더 주의가 필요하다. 즉, 플랫폼빌더에서

사용자 삽입 이미지


위와 같이 Settings 값을 확인해보면 Target Type이 여러가지가 나온다. 당연히 DLL을 만들 것이기 때문에 Dynamic-Link Libaray를 선택하여 컴파일을 해야 한다. 플랫폼빌더에 대한 지식이 부족했던 시절에 이와 같이 하였는데 .dll 파일만 생성되고 .lib는 생성되지 않아서 .lib 파일을 만들기 위해 위의 Static Library로 컴파일하여 생성된 .lib 파일을 응용프로그램 컴파일시 사용하였는데 이렇게 되면 제목에 보인 에러가 계속 생기게 된다. .dll 파일만 생기고 .lib 파일이 생성되지 않았던 것은 DLL 소스코드에 대한 변경이 없어서 .lib 파일이 생성되지 않았던 것이고 이전에 생성된 .lib 파일은 이미 응용프로그램 컴파일을 위한 디렉토리로 이동을 해둔 상태였기 때문에 발생한 문제였다(지금 생각해보면 참 어의없는 경우..)


물론, 지금까지 설명한 경우보다 더 다양한 케이스가 있을 수 있겠지만 대부분은 위와 같은 경우에 대한 처리를 하면 쉽게 다 해결될 것이다. 대부분의 경우 컴퓨터는 거짓말(?)을 하지 않기 때문에 화를 내기 보다는 좀 더 침착하게 자신이 무엇을 잘못 처리했을까를 좀더 깊게 고민해보는 것이 좋을 것 같다


'IT > Programming' 카테고리의 다른 글

K-Fold 교차 검증  (0) 2022.01.21
Python #2] 파이썬을 활용한 크롤링(crawling)  (0) 2020.01.15
Python #1] Python 개발환경 설치하기  (0) 2020.01.15
문자열 변환  (0) 2008.11.28
AND