IT한 것/Mobile (iOS, AOS) 15

Redundant #include of module 'A' appears within 'B' 오류 해결 과정

레거시 C 모듈을 objective c 에서 사용하고 있었는데, Xcode를 업데이트 하면서 이런 오류가 발생하기 시작했다. 직역해보자면 B라는 곳에서 A 모듈에 대한 헤더포함(include)이 중복되었다 정도로 읽힌다. 맞다. 내가 사용하던 레거시 C모듈은 수많은 C 함수를 구조체에 함수 포인터 목록으로 만들어주는 작업을 전처리기만으로 수행한다. 그러다보니, 한 헤더에서 A.h를 여러번 include 하여 사용하고 있다. (이거 하느라 삽질 엄청한 과거의 기록이 새록새록) 그런데 왜 갑자기 이런 오류를 발생시켰을까? (예전까지 잘 사용했었음) 가장 먼저 찾아낸 것은 이 옵션이다. 모듈이 뭔지는 모르겠으나 C나 Objective C 코드도 모듈로 사용하게 한다고 한다. (이 옵션을 끄면 빌드문제는 해결됨..

duplicate symbol 찾기 스트립트

iOS 개발을 하다보면, 외부 라이브러리를 사용하면서 종종 기호 충돌을 겪기 마련이다. 뭐 한두개 정도는 그냥 슥슥 이름 바꾸거나 빼면 되지만, 그 목록이 많은 경우에는 참 곤란해진다. 그래서 귀찮아서 아카이브 파일을 분석해서 비교하는 스크립트를 간단 개발해봤다. #!/bin/bash MODULE="find_dup.sh" DATE="20180213" FILEA=$1 FILEB=$1 if [ ! $# -ge 2 ]; then echo "> This script($MODULE) find duplicated symbols between archive files." echo "> Usage:" echo "$MODULE archive_file1 archive_file2" echo " It has no option..

Xcode 12 iOS 시뮬레이터용으로 빌드시 실패하는 경우

Xcode 12, building for iOS Simulator, but linking in object file built for iOS, file for architecture arm64 아마 이미 많은 검색을 해봤을거라고 판단한다. 위와와 비슷한 문구를 만났을 것이고, 해결책도 많이 봤을 것이다. 보통 그런 해결책들 (VALID ARCH 관련 옵션처리)이 맞긴 하겠지만, 나 처럼 configure 를 이용하여 커맨드라인으로 직접 빌드하는 환경에는 전혀 도움되지 않았다. 때문에 대체 뭐가 바뀌었고, 무엇 때문에 안되는지 파악하기로 했다. 기존에는 -arch armv6 -arch armv7 -mios-version-min=6.0 -isysroot 등의 옵션을 사용하여 iOS Device 라이브러리를 ..

Archive를 -l 로 합치기

이리저리 찾다보면, 이 옵션은 디버깅용으로 빌드시 다른 플랫폼들이 빌드되면, 시간이 걸리는 것을 줄이기 위해서 현재 테스트할 플랫폼에 맞는 것만 빌드하도록 하는 것이라고 한다. 뭐 괜찮은 생각인것 같은데, Archive 를 만드는데 문제가 발생했다. 이상하게 해당 Archive를 이용하면 duplicate symbol 발생으로 링킹에 실패하는 문제가 발생했다. 그것도 기본 설정으로는 아무 문제가 없었는데, -all_load 옵션으로 Archive에 내장된 모든 심볼을 로딩하게 하면, 문제가 발생했다. nm 유틸리티를 이용하여 symbol목록을 확인 한 결과 정말로 모든 symbol이 두 벌씩 들어가는 것을 확인 했다. 프로젝트 옵션의 주요 값으로는 base sdk iPhoneOS 4.0 SDK archi..

SBFormattedPhoneNumber in iPhone OS 4.0 GM Seed

기존 버전에서는 폰의 전화번호를 가져오기 위해서 NSUserDefault 클래스에서 SBFormattedPhoneNumber로 명시된 키에 해당하는 값을 가져오면 되었다. 그런데 허허.. 없다. 혹시 인터페이스라도 생긴건가??? 하여튼 없다. ㅠㅠ 미련을 버리지 못해, 심볼을 뒤지기 시작했다. liblockdown.dylib에서 phonenumber 심볼을 찾았다. (for architecture armv6):liblockdown.dylib: 000082dc S _kLockdownPhoneNumberKey 먼 산을 바라본다. 내부 심볼인것 같다. 쥐쥐. 2010.06.17 쥐쥐는 아닌것 같다. 프로젝트 옵션에서 deployment target을 3.x대로 해두면, 다시 이 값이 나타난다. 새로운 기능을 ..

struct stat,dirent in iPhoneOS 4.0 GM

__DARWIN_64_BIT_INO_T 플래그가 설정되어 있다. 때문에 stat 구조체의 길이가 96에서 108로 변경되었다. readdir도 못 써먹게 되어있다. dirent 구조체의 길이가 264에서 1048로 변경되었다. 망할 ㅠㅠ 리빌드 말고는 대처할 방법이 생각 안난다. .2010.06.17 좀더 확인해보니 시뮬레이터만 그렇고, 디바이스에서는 예전부터 설정이 되어 있다. 즉, 사용자 입장에서는 아무상관없는거다. 그래 개발하는 사람은 고생하라는건가. ㅋㅋ

iPhone SDK 4.0 beta3에서 기존 라이브러리 링킹 실패(symbol not found)

iPhone SDK 4가 아직 완성 release버전은 아니지만, 이전의 호환성을 위해서 기존에 빌드된 라이브러리를 그대로 링킹 시도를 해보았는데. 분명히 링킹이 되었음에도, symbol not found 오류를 내뱉어낸다. ar로 모듈을 까보아도 분명히 심볼은 있음을 확인할 수 있다. 혹시나 해서 특정 object 파일을 까보기 시작했다. 자체 makefile로 빌드한 모듈 x86.o: 00000000 t +[XWHWInfo_local getDeviceID] x86.o: 000000b1 t +[XWHWInfo_local getPhoneNumber] x86.o: U .objc_class_name_NSObject x86.o: U .objc_class_name_NSUserDefaults x86.o: U .o..

Finder의 압축하기를 console에서 하기.

아이폰용 어플의 패키징을 해서 줘야하는 경우가 있다. 일반적인 nix 환경에서는 tar.gz 으로 전달해주면 끝인데, 배포용 어플을 그렇게 주면, invalid signature 등의 오류로 appstore에 등록이 안된다고 한다. 모듈을 풀어서 zip으로 다시 묶어도 말이다. 그런데 Finder에서 zip으로 묶으면 잘 된단다. 혹여나 해서 구글링을 해보니 ditto란 툴로 하면 Finder와 같은 방식으로 묶어준다고 한다. 하나 아쉽게도 옛날 자료라서 최근 버전에서는 정상작동 하지 않는다. mac osx 10.6.2에서 확인해본 결과 ditto -c -k --keepParent --sequesterRsrc [압축할 파일 목록] [압축된 파일이름] 으로 정상 압축에 성공했다. 과연.. appstore에..