냠냠쩝쩝/C++

LNK 2019 에러

GOOROOM 2021. 7. 31. 18:19
반응형

컴파일을 하다보면 종종 발생하는 에러중에 LNK2019라는것이 있다.

하나의 문제로 인한 에러가 아니여서 좀 골치아픈 에러중에 하나다.

 

LNK2019 에러의 원인들에 대해 알아보자.

 

1. 필요한 라이브러리(LIB)를 추가했는지 확인하자.

  • Visual Studio 2019 기준
  • 아래와 같이 프로젝트우클릭하고 속성을 눌러 속성 페이지를 열어준다.
  • '구성속성 → 링커 → 일반 → 추가 라이브러리 디렉터리'에서 추가할 라이브러리 폴더를 설정한다.

프로젝트 속성

  • 그 다음 아래와 같이 '구성속성 → 링커 → 입력 → 추가 종속성'에 추가할 라이브러리를 입력해주면 된다.

추가 종속성

  • 또는 아래 처럼 전처리기로 추가할 수도 있다.

#pragma comment(lib, "라이브러리이름.lib")

 

 

2. 프로젝트에 헤더 파일(.h)과 구현 파일(.cpp)을 추가했는지 확인하자.

  • 소스코드에 #include 전처리기로 헤더 파일을 추가했지만, 프로젝트에는 해당 헤더 파일과(.h)과 구현 파일(.cpp)가 추가되어있지 않은 경우 LNK2019 에러가 발생한다.

 

3. 빌드모드를 전환하지 않았나 확인하자.

  • 아래와 같이 솔루션 구성을 기존의 구성과 다른 Debug 혹은 Release모드로 전환했는지 확인하자.
    각 모드의 빌드 설정은 개별로 해줘야하기 때문이다.

솔루션 구성

 

4. 파일 확장자가 다른 구현 파일을 같은 프로젝트에 넣고 빌드했는지 확인하자.

  • C와 C++의 구현 파일 확장자는 각각 .c 와 .cpp로 컴파일에서는 문제가 없으나 이름변경(Naming Mangling)이 다르기 때문에 링킹 에러가 발생한다.
  • 이런 경우 .c 확장자를 .cpp 로 변경해주면 해결된다.

 

5. inline 함수의 선언과 정의를 각각 헤더 파일(.h)과 구현 파일(.cpp)에 분리했는지 확인하자.

  • inline 함수를 선언과 정의를 각각 헤더 파일과 구현 파일에 분리하면 LNK2019 에러가 발생한다.
  • inline 함수는 해당 함수가 호출되는 부분을 inline 함수 정의 코드로 대체하는 방식이므로, 선언과 정의가 분리되어 있으면 인라이닝이 불가능하여 링크에러가 발생한다.
  • inline 함수는 헤더 파일에 선언과 정의를 같이 넣어줘야 한다.

 

6. template을 사용할 때 선언과 정의를 각각 헤더 파일(.h)과 구현 파일(.cpp)로 분리했는지 확인하자.

  • template의 경우 동적으로 각 데이터 타입에 맞는 소스 코드를 만들어 내는 방법이므로, 선언과 정의를 각각의 파일로 분리해서는 안된다.

 

https://vaert.tistory.com/5의 내용을 참고했습니다.

반응형