정말 뜬금없는 오류가 아닐 수 없다.

우선 나를 비롯한 많은 사람들이, "내가 뭔가 잘못한 게 있나?"하며 프로젝트 설정, 소스코드, 경로 설정을 이잡듯 뒤집어 엎었을 것이다.

한마디로 정리하자면, 내가 뭔가 잘못한 건 아니다. 당당히 남탓을 해도 된다(......)


일단 이 오류를 발견한 계기를 거슬러 올라가본다. 컴퓨터를 옮기기 전 VS2010에서 작업하던 게임 프로젝트가 있었다.

오랜만에 잠깐 손보고 싶어서 프로젝트를 열어봤는데, 설정을 티끌만치도 건들지 않고 전 환경과 동일한 경로, 같은 파일, 같은 폴더를 만들어 두었으나 링크에러만이 나를 반겼다!!

찾아보니 비주얼스튜디오 및 VC 컴파일러가 버전업하면서 sprintf, fprintf등등 std시리즈 함수가 define된 원형 함수를 약간 바꾼 듯 한데,

기존 구 VC 컴파일러로 작업된 SDL라이브러리가 현재는 없는(정확히는 이름이 다른) 함수를 쓰느라 깨져버린 것...

사실 구버전이라고 하기도 무색한게 불과 2010에서까지만해도 잘 되었고, 이런 io함수는 감히 쉽게 바꿀만한 함수가 아니기 때문에...

최적화 목적이 아니었을까 싶지만 대체 왜 바뀐건지 정확히는 모른다. 별로 알기도 귀찮고.


자세한 원인은 밑의 사진을 참조 - 출처는 스택오버플로우("unresolved external symbol __imp__fprintf and __imp____iob_func, SDL2").

함수 포인터 배열을 넘겨주던 기존 방식이, 파라미터 번호에 따라 해당 함수 포인터를 바로 넘겨주도록 바뀐 모양.


그래서 해결법은, 세 가지 방법 중 하나(혹은 둘?)를 고르면 된다.

1. 위의 스택오버플로우 글에 적혀있듯이 __iob_func() 함수를 직접 선언한다. stdin, stdout, stderr에러가 났을 때만 가능하지 싶다.

2. stdio함수 링크 오류인 경우 링커 옵션에 legacy_stdio_definitions.lib를 추가하라카신다.

3. 오픈 소스 라이브러리인 경우, 해당 사이트(나의 경우 sdl)에서 제공하는 라이브러리 프로젝트를 직접 받아 VS2015로 열면 컨버팅을 해주는데, 이걸 컴파일해서 출력된 lib, dll파일을 이용하는 것.



간만에 보는 참 반가운 친구. 오랜만이당☆★☆★!!!!!!!!!!


잡담.

몰랐는데 나 충돌처리 부분을 만들어 뒀었다...........................게임오버 화면도 만들어 뒀었다.

뭐가 귀찮아서 멈춘거지!!!근데 때려치고 비주얼 노벨식 어드벤처 게임 엔진 만들고싶다. 플랫포머는 은근히 그래픽적인 면에서 구현이 귀찮단말이지..

+ Recent posts