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이 올 수도 있다.
'Development Experience > C, C++' 카테고리의 다른 글
iterator 쓸 때 주의 사항 (feat. Cannot dereference end list iterator) (0) | 2023.07.05 |
---|---|
C++ unique_ptr 의 deleter (0) | 2020.12.16 |
c++ std::function 과 std::bind, C2893 Error (0) | 2020.12.15 |
C++ 다른 프로젝트에 있는 파일 참조하기 (0) | 2020.12.15 |
C++ 스마트 포인터 간단 정리 (0) | 2020.12.09 |