관리 메뉴

KorSA

LNK2019 에러와 네임 맹글링, 그리고 extern 본문

Development Experience/C, C++

LNK2019 에러와 네임 맹글링, 그리고 extern

Praiv. 2021. 3. 18. 10:42
320x100

LIVE555로 Frame을 받아서 FFMPEG에서 Decoding 하는 프로그램을 만드는 중에 FFMPEG의 함수를 사용하는 부분에서 자꾸 LNK2019 에러가 발생하였다. 몇 번의 삽질 끝에 해결하였는데,이 과정에서 알게 된 내용은 아래와 같다.

 

1. LNK2019 에러

Linker > General > Additional Library Directories에 경로를 추가해도 해결이 안될 때에는 Linker > input > Additional Dependencies 에도 lib 파일을 추가해주어야 한다. 예를 들어 FFMPEG 라이브러리를 추가하고 싶은 경우 avformat.lib, avcodec.lib 등의 lib 파일 이름을 적어주면 오류가 해결된다.

 

2. 네임 맹글링 (Name Mangling)
=> C++ 컴파일러들은 각 컴파일러마다 저마다의 규칙으로 함수 이름을 변경하는데, 이를 네임 맹글링이라 한다.
=> gcc로 컴파일한 후 readelf 명령으로 바이너리 파일 안의 심볼을 찾아보면 함수 이름이 그대로 있지만, g++로 컴파일한 후 readelf 명령으로 보면 함수 이름이 컴파일러에 의해 변경되어져 있다.

3. extern "C" {}
=> 네임 맹글링을 수행하지 않도록 명시적으로 지정해주는 키워드이다.
=> extern 키워드는 "링크 규칙(linkage)"을 정하기 위한 키워드이다.
=> 변수의 경우 extern이 없으면 기본 적으로 모듈 안에서만 참조할 수 있는 internal linkage 상태이고, extern이 있으면 외부에서도 해당 변수를 참조할 수 있는 external linkage 상태이다.
=> 함수의 경우 기본적으로 external linkage이고, static을 붙여서 internal로 만들 수 있다.
=> extern "C"는 외부의 C 모듈이 접근가능하도록 컴파일하라는 의미이다.
=> 마찬가지로 extern "C++", extern "JAVA" 등도 각각 외부의 C++ 모듈, JAVA 모듈이 접근 가능하도록 컴파일하라는 의미이다.
=> 외부 모듈이 C로 컴파일된 모듈일 경우, C++의 네임 맹글링 규칙을 모르기 때문에 C++ 모듈에서 extern "C" {}를 사용하여 네임 맹글링을 사용하지 않아야 한다.

=> extern 다음의 키워드로 Calling Convention이 올 수도 있다.

 

 

 

참고> kldp.org/node/121134

728x90
728x90
Comments