본문 바로가기

Developement/C/C++

MinGW w64 로 ffmpeg 관련 링크 오류 !


 minGW 의 버젼을 4.9.x 대로 올리면서 DirectX 와 기타 등등의 Windows 의 모든 걸 쓸 수 있도록 나오는 mingw-w64로 선택 했더니 ffmpeg 라이브러리에서 이런 오류가 나온다.

 unistd 에 포함되던 sleep, globalfree, glob, mkstamp 등이 기본 라이브러리에 없다는 말이다! 문제는 이게 4.9.x 버젼대에만 있는 것이 아니라 5.1 최신판도 마찬가지란 점...


 해결책을 찾아야 하는데, 이걸 직접 내가 만들어 쓰는 것도 문제일 탠데 ... 방법을 찾는대로 이어서 포스팅 하도록 하겠다.


 이 문제는 이전에 사용한 ffmpeg 을 새로운 minGW 로 빌드 하고, ffmpeg 에 다음 소스들을 수정 해야 한다.


libavutil\file.c
libavutil\file_open.c
libavutil\log.c
libavutil\random_seed.c
libavutil\time.c
libavformat\cache.c
libavformat\dashenc.c
libavformat\file.c
libavformat\hdsenc.c
libavformat\smoothstreamingenc.c


 위 소스들은 unistd.h 를 참조 하고 있는데, MinGW-W64 의 gcc 는 이 형태를 posix 로 사용하기 때문에 Windows 에서 빌드 할 때엔 unistd.h 앞에 windows.h 가 먼저 참조 되도록 수정 되어야 한다는 것이다.



 단, windows.h 를 추가 할때 그냥 하는 것이 아니라 #ifdef _WIN32 ~ #endif 로 묶어 주어야 하며, 특히 random_seed.c 의 경우는 config 에서 HYPE_CRYPTGENRANDOM 이 설정되어 있을 경우 windows.h 를 추가 하도록 되어 있는데, 이 부분의 windows.h 추가 부분을 제거 후, unistd.h 위 쪽으로 옮겨 주어야 한다.


 그리고 MinGW-W64 로 빌드시, 이미 DirectX 관련 API 들이 사용가능 해 지기 때문에 ffmpeg 을 빌드 할 때 다음과 같이 library 를 참조 하도록 추가 해야 한다. (안그려면 DirectX 와 DirectDraw 등의 심볼릭 링크 오류의 폭풍을 맛본다)


compress(), uncompress() 오류 나는 것 또한 libz 추가 해야 하는 것임.