파일이 링크되는 아키텍처가 아닌 아카이브 용으로 빌드되었습니다 (i386).


79

정적 라이브러리를 만들어야합니다. iPhone 및 iPad 앱에서 사용하고 싶습니다. 시뮬레이터를 실행하려고하면 오류가 연결됩니다. iOS 개발이 처음입니다. 친절하게 도와주세요.

ld : 경고 : /Users/valuelabs/Desktop/DruvaProject/libraries/libnetUtils.a 파일을 무시하고 파일이 연결되는 아키텍처가 아닌 아카이브 용으로 빌드되었습니다 (i386) 아키텍처 i386의 정의되지 않은 기호 :
"_OBJC_CLASS _ $ _ netUtils", 참조 : ViewController.o ld의 objc-class-ref : 아키텍처 i386에 대한 기호를 찾을 수 없음 clang : 오류 : 링커 명령이 종료 코드 1로 실패했습니다 (호출을 보려면 -v 사용).

아키텍처에 i386을 추가해 보았습니다. 하지만 운이 없다

답변:


77

이 같은 문제로 고생하고 빌드 설정 업데이트, 링커 검색 경로 지우기 등의 모든 수락 된 답변을 따른 후. 마침내 저에게 도움이되는 답변을 발견했습니다.

빌드하기 전에 iOS 장치 대신 올바른 유형 (iPhone Simulator)을 선택했는지 확인하십시오. 그런 다음 재건하십시오. 그렇지 않으면 Mac (i386)의 시뮬레이터에서 iOS 장치 (arm 프로세서) 용으로 빌드 된 라이브러리를 사용하려고합니다. 분명 했어야했지만 그렇지 않았습니다.

전에:

iOS 기기 설정

후:

iPhone 5.1 시뮬레이터 설정

이제 Navigator의 Products 그룹에서 정적 라이브러리 (.a 파일)를 마우스 오른쪽 버튼으로 클릭> Finder에 표시를 클릭하면 Debug-iphoneos 대신 Debug-iphonesimulator 폴더에 있음을 알 수 있습니다. 원래 폴더 이름에 신경 쓰지 않았거나 더 일찍 생각했을 수도 있습니다.

도움이 되었기를 바랍니다.


이것은 나를 위해 그것을 해결했습니다. 의도하지 않은 아키텍처를 구축하는 데는 여러 가지 방법이 있으며 미래의 검색자는 이러한 답변 중 많은 것을 살펴보고 자신에게 적용되는 답변을 찾을 수 있습니다!
Danny

업데이트 : xcode 5 및 iPhone 64 비트 시뮬레이터 이후, 다른 아키텍처 용으로 빌드되는 libPods.a에 오류가 발생하지만 다른 유형의 시뮬레이터에서는 발생하지 않습니다. \
Nour1991

13
Nour1991의 시도 설정 @ Build Settings -> Build Active Architecture OnlyNo
MMiroslav

@MMiroslav 나는 디버그에서 배포해야하기 때문에 yes로 설정해야했습니다.
Pedro Romão 2014

42

때때로 이러한 유형의 오류는 당신을 짜증나게합니다!

파생 데이터 제거는 저에게 효과적입니다.

해결 단계

1) XCODE에서> Windows> 프로젝트> 프로젝트 선택> 파생 데이터 삭제> XCODE를 종료하고 다시 엽니 다> MAC-O- 링커 빌드 실패 오류가 발생하는 경우> 링크 참조> 정리 및 빌드 다시.


1
XCode 8에서 파생 데이터를 삭제하려면 여기를 참조하십시오. stackoverflow.com/questions/38016143/…
Dan Carlson

28

귀하 libnetUtils.a는 귀하의 대상과 다른 아키텍처를 위해 구축되고 있습니다.

libnetUtils 빌드 설정을 확인하십시오. 구축되는 아키텍처와 지원되는 아키텍처 목록은 대상 아키텍처의 (약한) 상위 집합이어야합니다. 여기서 복잡성은 결과 아키텍처가 "아키텍처", "활성 아키텍처 만 구축"및 "유효한 아키텍처"와 같은 다양한 설정에 분산되어 있다는 것입니다.

"활성 아키텍처 만 빌드"설정은이 작업을 특히 혼란스럽게 만듭니다. 예를 들어 시뮬레이터 용으로 빌드한다고 가정합니다. Debug에 대한 "Build active architecture only"설정이 NO로 설정된 경우 "Architectures"및 "Valid architectures"(아마도 armv7 등)에 나열된 모든 아키텍처를 빌드합니다. 그러나 libnetUtils에서 해당 설정을 Yes (디버그 : Yes)로 설정하면 i386 용으로 만 빌드됩니다. 따라서 링커가 armv7을 i386과 연결하려고하면 실패합니다.


26

무시 파일 경고가 표시되면 무시 된 파일에서 실행 lipo -info하여 아래와 같은 아키텍처를 찾습니다.

lipo -info libnetUtils.a

그러면 i386, armv6, armv7, armv7s, x86_64 등이 인쇄됩니다. 일반적으로 해당 아키텍처는 대상 빌드 플랫폼과 일치해야합니다. 예

  • i386 = iOS 시뮬레이터 또는 Mac OS X에서 32 비트 빌드
  • armv6 armv7 arm7s = iOS 기기
  • x86_64 = Mac OS x에서 64 비트 빌드

불일치에 따라 대상 플랫폼에 맞게 라이브러리를 다시 빌드하거나 대상 플랫폼을 변경해야합니다.

참고 : 팻 바이너리 lipo -info의 경우 위의 아키텍처 조합을 인쇄합니다.


2
그러나 이것은 OP에 대답하지 않았습니다. 이것은이 문제를 디버깅하기위한 훌륭한 도구입니다. 내가 알고 싶은 것은 위에서 언급 한 모든 아키텍처로 바이너리를 어떻게 빌드합니까?
Jay Q.

신경 쓰지 마세요. 여기에서 답을 찾았습니다. stackoverflow.com/questions/2793392/… lipo를 사용하여 '-create'플래그를 사용하여 빌드를 결합합니다
Jay Q.

ld : 경고 : iOS-armv7 용으로 빌드하지만 iOS-arm64 용으로 빌드 된 파일과 연결하려고 시도하면 아키텍처 armv7에 대해 정의되지 않은 기호이 경고는 clang : error : linker command failed with exit code 1 (use -v to see invocation) this error . 자체 라이브러리 / 프레임 워크를 사용하는 경우 프로젝트 라이브러리와 Adopter 모두에서이를 변경하십시오. 빌드 설정 -> 만 No로 활동 아키텍처 구축
Shrikant Phadke

참조하시기 바랍니다 medium.com/@edisonlo/...을
Shrikant Phadke

9

내 조언이 정확한지 실제로는 모르지만 다음을 확인하십시오.

  • 프로젝트 선택
  • "Build Settings"를 선택합니다.
  • 아키텍처 확인 :
    • 유효한 아키텍처는 "armv6 armv7"이어야합니다.
    • 지원되는 플랫폼은 "iphonesimulator iphoneos"여야합니다 (아마도 iPad 일 수도 있지만 모르겠습니다).
    • Base SDK – iOS SDK (iOS 5.0이 있습니다).

내가 명백한 선장이라면 나를 판단하지 마십시오 :)


17
Alexander의 조언 외에도 'Build Active Architecture Only'설정이 'NO'로 설정되어 있는지 확인하는 것이 좋습니다. 이것은 최근에 나를 넘어 뜨렸다.
TPoschel

5

사용하려는 라이브러리가 iOS 시뮬레이터 용으로 보편적으로 컴파일되지 않았 음을 의미합니다 (i386 기호는 Mac 용입니다). 실제 장치에서 실행하면 정상적으로 작동합니다.


3

같은 문제가 있었고 페이지에서 다양한 솔루션을 시도했습니다. 여전히 내 라이브러리가 arm64 용이 아니라는 메시지가 표시되었습니다.

마지막으로 해결 방법 :

  • 텍스트 편집기에서 라이브러리의 project.pbxproj를 열었습니다.
  • VALID_ARCHS 검색
  • 4 개의 발생이 있었는데 그 중 2 개는 arm64를 포함하지 않았습니다.
  • 수동으로 체인에 arm64를 추가했습니다 (VALID_ARCHS = "arm64 i386 armv7 armv7s").
  • lib를 다시 빌드하면 괜찮 았습니다.

때때로 XCode에 의해 표시되는 빌드 설정이 불완전하고 프로젝트 파일과 정확하게 일치하지 않는 것 같습니다.


3

또한 빌드 설정 내의 배포 대상이 종속 및 종속성에 대해 동일한 지 확인해야합니다. 정적 라이브러리 대상에 대해 iOS 13이 설정되어 있고 해당 라이브러리를 사용하는 프레임 워크에 대해 iOS 10.0이 정의되어 있음을 확인했습니다. 둘 다 10.0으로 전환하면 문제가 해결되었습니다.


이 질문에 대한 다른 모든 제안을 확인했습니다. 이것이 저를
괴롭힌

0

나에게 그것은 설정을 고정 Build Active Architecture Only으로 Multiple values그렇게, 당신이 그것을하고 설정을 확장해야, DebugYESReleaseNo. 이제 내 장치에서 컴파일됩니다.


-1

이 문제는 장치에서 응용 프로그램을 실행할 때 발생하지 않습니다. iOS 기기에서 코드를 실행하여 확인할 수 있습니다.


-2

나는 armv7s의 아키텍처도 가지고있었습니다. 나는 그것을 삭제하고 armv6과 armv7이 목록에있는 유일한 두 개인 지 확인했습니다. 지금 작동합니다


당신은 armv7s를 제외해서는 안
마치에이 SWIC에게
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.