2014년 8월 20일 수요일

Xcode 6 Beta 6 에서 발생한 링크에러 및 해결

Xcode 6 Beta 6를 사용하면서 약간의 변경점 때문에 Swift 코드를 일부 수정하고 빌드를 했더니 링크 단계에서 에러가 발생했다. 이번 베타에서도 뭔가 깊숙한 곳에서 바뀐게 있나 하고 답답해 했었다. 다행히도 해결책이 있어서 글로 정리해 본다.

문제

아래와 같은 식의 에러가 발생한다면 이 케이스에 해당한다.
Undefined symbols for architecture x86_64:
  "__TFSs15_arrayForceCastU___FGSaQ__GSaQ0__", referenced from:
      __TFC15SRChocoDemo_OSX15SRWindowManager9processesfS0_FT_GSaGSQCSo20NSRunningApplication__ in SRWindowManager.o
      __TFC15SRChocoDemo_OSX15SRWindowManager15windowProcessesfS0_FT_GSaGSqCSo20NSRunningApplication__ in SRWindowManager.o
      __TF15SRChocoDemo_OSX9launchAppFTSSGSaSS__GSQCSo6NSTask_ in SROtherApp.o
  "__TFSs21_arrayConditionalCastU___FGSaQ__GSqGSaQ0___", referenced from:
      __TFV15SRChocoDemo_OSX8SRRegexp4findfS0_FSSGSqGSaCSo20NSTextCheckingResult__ in SRRegexp.o
  "__TFSs26_forceBridgeFromObjectiveCU__FTPSs9AnyObject_MQ__Q_", referenced from:
      __TFCSo6NSDateg14dateComponentsT4yearSi5monthSi3daySi4hourSi6minuteSi6secondSi_ in NSDateExtensions.o
      __TFCSo6NSDateg17UTCDateComponentsT4yearSi5monthSi3daySi4hourSi6minuteSi6secondSi_ in NSDateExtensions.o
      __TFCSo6NSDateg7weekdaySi in NSDateExtensions.o
      __TFCSo6NSDateg12countOfWeeksSi in NSDateExtensions.o
      __TFCSo6NSDateg11weekOfMonthSi in NSDateExtensions.o
      __TFCSo6NSDate16generateWithYearfMS_FTSi5monthSi3daySi4hourSi6minuteSi6secondSi_GSqS__ in NSDateExtensions.o
      __TFC15SRChocoDemo_OSX15SRWindowManager15windowProcessesfS0_FT_GSaGSqCSo20NSRunningApplication__ in SRWindowManager.o
      ...
  "__TFSsoi1oUSs17_RawOptionSetType_USs21BitwiseOperationsTypeSs9Equatable__FTQ_Q__Q_", referenced from:
      __TFCSo6NSDateg14dateComponentsT4yearSi5monthSi3daySi4hourSi6minuteSi6secondSi_ in NSDateExtensions.o
      __TFCSo6NSDateg17UTCDateComponentsT4yearSi5monthSi3daySi4hourSi6minuteSi6secondSi_ in NSDateExtensions.o
      __TFC15SRChocoDemo_OSX10SRDatetimes4dateGSqCSo6NSDate_ in SRDatetime.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
에러가 좀 길어서 무서운데, 결론적으로 링크 단계에서 특정 심볼을 찾지 못 하는 오류이다.

원인

정확한 원인은 모르지만, Beta 5 혹은 그 이전 버전과 비교해서 Beta 6의 DerivedData가 무언가 바뀐 것 같다. 그래서 링크 단계에서 오류가 발생하는 것으로 추정된다.

참고로 DerivedData 는 Preferences - Locations 에서 확인 할 수 있다.
왠만하면 Default 일 테고, 그래서 사용자 명을 제외하면 아마도 똑같은 위치에 있을 것이다.

해결

위 DerivedData 디렉토리의 내용물을 몽땅 지우면 해결 될 수도 있다. 하지만 전체를 지우면 EditorKit이 계속 죽어버리는 문제가 발생 할 수도 있다. 이 문제를 해결하느라 참 애먹었다. 아시는 분은 아시겠지만 이런 에디터 킷 서비스가 죽어버리면 문법 강조 및 자동완성이 동작하지 않는 치명적인 부작용이 발생한다.

어쨌든 안전하게 해결하려면 현재 빌드 오류가 발생하는 프로젝트의 DerivedData 만을 삭제하는 것을 추천한다. 물론 위 DerivedData 디렉토리의 내부를 보면 프로젝트 이름을 확인 할 수 있으므로 어렵지는 않을 것이다.

물론 더 쉽게 지우는 방법이 제공된다. Organizer 를 열어서 Products  탭을 열어보자.
빌드 오류가 발생하는 프로젝트를 선택하면 위 스크린샷 처럼 DerivedData 위치가 보이고 우측에 Delete 버튼도 보인다. 그냥 꾹 누르면 알아줘 지워준다.

내 경우 이렇게 한 뒤에 문제가 해결되었다.

댓글 없음 :