본문 바로가기

REAL Code

[Tip] Error LNK2019, Link Error 발생시 확인해볼 것들

반응형


예전에 과제하다가 찾았던 자료인데요 나름 유용한거 같아서 올립니다. ^.^


컴파일하다가 가끔씩 실수로 발생하는 Error중에 LNK2019가 있습니다. 잘 모를때는 사람 환장하게 만들기도 하죠.


 보통 이 에러는 셋팅을 잘못해서 생기는 경우가 대부분이므로 발생할대마다 그 상황에 맞추어서 무엇이 문제인지를 알아봐야 합니다.

 결국 case by case로 문제를 해결해야 하기 때문에 다음과 같은 몇가지 LNK2019에러가 떳을 대 점검해보면 좋은 셋팅입니다.

♡♡♡♡♡♡♡♡♡♡♡♡♡♡♡♡♡


1. LIB 파일을 추가하지 않았는지 확인해보자!

- 필요한 LIB파일을 프로젝트에 추가하지 않았을 경우에 LNK2019 에러가 발생합니다.

"프로젝트 속성" (단축키 ALT + F7)을 열어 '추가종속성'에 필요한 파일을 추가해 줘야 합니다.

또는 코드에 직접 전처리기를 이용하여 아래처럼 추가해도 됩니다.

#pragma comment(lib, "이름.lib")


2. 프로젝트에 헤더 파일(header file), 구현 파일(implementation file)을 추가했는지 확인해보자.!

- 이 경우는 소스코드에는 #include "head.h"처럼 헤더 파일을 추가했지만, Visual Studio의 프로

젝트에는 헤더파일과 구현파일을 추가하지 않은 경우를 말합니다. 이 같은경우에도 LNK2019가 발

생 할 수 있습니다.

따라서 #include로 포함시킨 헤더파일과 구현파일 모두를 프로젝트에 추가해야지 LNK2019에러가

발생하지 않습니다.


3. Release VS Debug mode - 빌드 모드(build mode)를 전환하지 않았나 생각해보자.

- 사용하는 IDE에 따라 다르겠지만, Visual Studio는 Release mode와 debug mode의 빌드 셋팅을 '각각'

해주어야 합니다. 즉, debug mode에서 셋팅을 바꿧다고 release mode에서 똑같이 적용되는게 아니라는

말입니다.

따라서 build mode를 전환할 때는 셋팅 값을 바꿔줘야 하는게 있는지 한번 생각해봐야 합니다.


4. c, cpp처럼 다른 확장자를 갖고 있는 파일을 같은 프로젝트에 넣고 링크하지 말자.!

- 하나의 프로젝트에 c와 cpp파일을 모두 넣고 링크를 하였을 경우.!

문법은 기본적으로 같으므로 컴파일에서는 문제가 없지만, c와 cpp는 Naming Mangling이 다르기 때문에

링킹 에러가 터집니다. 하지만 많은 분들이 아시다싶이 간단한 메크로를 사용하면 이를 예방할 수 있죠.

 

5. inline 함수의 선언과 정의를 헤더 파일과 구현 파일로 분리하지 말자.

- inline함수를 사용할 경우에 선언을 헤더 파일(확장자.h)에 두고, 정의를 구현 파일(확장자.cpp)에서

하면 LNK2019 에러가 생깁니다. 이유는 간단한데 함수를 코드에 인라이닝 한다는것은 inline함수를 호출

한 부분에 해당 inline함수의 정의를 넣는다는 뜻입니다. 그런데 헤더파일에 함수명만 선언되어 있다면

함수 정의를 인라이닝 할 수 없기 때문에 링크에러가 생기는 것입니다. 이 역시 해결책은 간단합니다.

바로 inline 함수의 경우에는 헤더 파일에 선언과 정의를 함께 넣는 것이지요.


6. template를 사용할 경우에는 선언과 정의를 헤더파일과 구현파일로 분지하지 말자.

- C++에서 선언과 정의를 각각의 파일로 분리하면 안되는 경우가 하나 더 존재합니다. 바로 template를

사용할 경우인데요. template의 경우에는 동적으로 각각의 형에 맞는 소스코드를  만들어 내는 방법이므

로 선언과 정의를 각각의 파일로 분리해서는 결코 안됩니다. 물론, 이 역시 IDE툴을 잘 이용하면 분리할

수 있는 방법이 있지만 그냥 하나의 헤더 파일에 다 구현하기를 추천하여 봅니다.

 

 


제가 몇가지 경우를 나열해 보았는데요, case by case다 보니 이게 모든 경우의 수는 아닐거라 생각됩니다.

혹시 이런 경우가 아닌 직접 겪어보셨던 다른 경우가 있다면

댓글 달아주세요~^_^.

 

 

반응형
이웃추가