아키텍처 armv7에 대한 정의되지 않은 기호


307

이 문제는 나를 미치게 만들었고 그것을 고치는 방법을 해결할 수 없습니다 ...

    Undefined symbols for architecture armv7:
  "_deflateEnd", referenced from:
      -[ASIDataCompressor closeStream] in ASIDataCompressor.o
  "_OBJC_CLASS_$_ASIDataDecompressor", referenced from:
      objc-class-ref in ASIHTTPRequest.o
  "_deflate", referenced from:
      -[ASIDataCompressor compressBytes:length:error:shouldFinish:] in ASIDataCompressor.o
  "_deflateInit2_", referenced from:
      -[ASIDataCompressor setupStream] in ASIDataCompressor.o
ld: symbol(s) not found for architecture armv7
collect2: ld returned 1 exit status
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 failed with exit code 1

나는 그것이 다음과 관련이 있다고 생각합니다.

ld: symbol(s) not found for architecture armv7

그러나 나는 덧붙였다 : libz.1.2.3.dylib그리고 도움이되지 않는 사람, 어떤 아이디어가 있습니까?


기존 답변에서 다루지 않은 또 다른 가능성은 -ObjC다른 링커 플래그를 사용하고 있으므로 사용하지 않아야하는 외부 정적 라이브러리 (예 : Parse 등)의 Obj-C가 표시 될 수 있다는 것입니다. : 이러한 경우 내 대답을 참조하십시오 stackoverflow.com/a/26151208/901641
— ArtOfWarfare

2
경험상, XT 코드는 파일이 프로젝트에 추가되지 않았을 때 i386 아키텍처 (또는 기타)에서 찾을 수없는 Match-O 및 기호와 같은 오류를 발생시킵니다. 프로젝트 폴더를 마우스 오른쪽 버튼으로 클릭하고 "<프로젝트>에 파일 추가"를 수행 할 수 있습니다.
— Fabricio PH

실제로 nm 도구를 사용하여 생성 된 콘크리트 기호를 볼 수 있습니다. .o 파일의 경로에 대한 터미널로, nm -g심볼을 호출하는 파일과 심볼을 가져야하는 파일에서 실행 하면 파일이 일치하는지 여부를 확인해야합니다. 나노 -g file.o 당신이로 분해 해제는 C ++ 심볼을 검사 할 수 있습니다 : 나노-GC file.o
— james_alvarez

여기 누군가 도와주세요? 아래 오류가 발생하지만 위의 해결책 중 어느 것도 나를 위해 작동하지 않습니다. 가능한 모든 설정으로 며칠을 보냈습니다. Undefined symbols for architecture armv7: "YGConfig::YGConfig(int (*)(YGConfig*, YGNode*, YGLogLevel, char const*, void*))", referenced from: _YGConfigNew in libyoga.a(Yoga.o) ld: symbol(s) not found for architecture armv7 clang: error: linker command failed with exit code 1 (use -v to see invocation)
— 붉은 악마

답변:


506

일반적인 원인

"아키텍처 armv7의 정의되지 않은 심볼"의 일반적인 원인은 다음과 같습니다.

  1. 당신은 헤더를 가져오고 올바른 라이브러리에 링크하지 않습니다 . 이것은 QuartzCore와 같은 라이브러리의 헤더에 대해 일반적입니다. 기본적으로 프로젝트에 포함되어 있지 않기 때문입니다. 해결하려면 :

    • 의 Link Binary With Libraries섹션에 올바른 라이브러리를 추가하십시오 Build Phases.

    • 기본 검색 경로 외부에 라이브러리를 추가 Library Search Paths하려면 빌드 설정 의 값에 경로를 포함시키고
      -l{library_name_without_lib_and_suffix}(예 : libz.a use의 경우 -lz) Other Linker Flags섹션에 섹션을 추가 할 수 Build Settings있습니다.

  2. 당신은 당신의 프로젝트에 파일을 복사 할 수 있지만에 파일을 추가 할 대상을 확인하는 것을 잊었다 . 해결하려면 :

    • Build Phases올바른 대상 의을 열고 Compile Sources누락 된 .m파일을 펼친 후 추가하십시오 . 이것이 당신의 문제라면 아래의 Cortex의 답변을 공표하십시오 .

  3. 당신은 다른 아키텍처 구축 정적 라이브러리를 포함 I386, 호스트 컴퓨터에서 시뮬레이터 등을. 해결하려면 :

    • 라이브러리 공급 업체의 프로젝트에 포함 할 라이브러리 파일이 여러 개인 경우 시뮬레이터 용 파일 (i386)과 장치 용 파일 (예 : armv7)을 포함해야합니다.

    • 선택적으로 두 아키텍처를 모두 포함 하는 뚱뚱한 정적 라이브러리 를 만들 수 있습니다 .



원래 답변 :

올바른 libz 파일에 링크되지 않았습니다. 파일을 마우스 오른쪽 버튼으로 클릭하고 파인더에서 파일의 경로는 iOS SDK 폴더의 어딘가에 있어야합니다. 예를 들어 여기 있습니다.

/ 개발자 / 플랫폼 /iPhoneOS.platform/ 개발자 /SDKs/iPhoneOS4.3.sdk/usr/lib

참조를 제거한 다음 라이브러리와 바이너리 연결 링크 섹션에서 빌드 단계를 다시 추가하는 것이 좋습니다.


4
프로젝트 설정 / 기타 링커 플래그에 "-licucore"라는 단어를 추가해야하기 때문일 수도 있습니다. 디버그 빌드에는 자동으로 추가되었지만 릴리스 빌드에는 자동으로 추가되지 않으므로 컴파일되지 않습니다.
— JulianB

4
나는 같은 문제가 있었다. 실제로 설치 노트를 제대로 읽지 않았으므로 새로운 버전의 bugsense에는 빌드 단계에서 libz 바이너리가 추가되어야한다는 것을 알지 못했습니다.
— Max MacLeod

2
헤더 파일에 선언 한 모든 클래스에 대해 각각의 .m 파일에 @implementation 섹션을 포함 했습니까?
— slcott

7
나는 단지 당신이이 질문에 대한 또 다른 답변을 참조하고 그것이 도움이된다면 투표를하도록 지시하는 것이 당신을 존중한다고 생각합니다.
— Andrew

도와 줘서 고마워! :) 나를 위해 Other Linker Flags 섹션에 명시 적으로 입력하는 것을 도와주었습니다 -framework <FrameWorkName>. XCTest에 문제가 있으므로을 추가해야했습니다 -framework XCTest. 감사! :)
— piotr_ch

198

어젯밤에 비슷한 문제가 있었고 문제는 Finder에서 Xcode의 프로젝트로 클래스를 드래그 한 사실과 관련이 있습니다.

해결책은 Build Phases 탭과 Compile Sources로 가서 클래스를 목록으로 드래그하는 것입니다.


6
나는 이것이 내가 찾고 있던 대답이라는 것을 깨달았 으면 좋겠다. 클래스를 복사 할 때 '대상에 추가'를 확인할 수 있습니다.
— T. Markle

1
우와 ... 수정이 쉬웠 기 때문에 기쁘다! 명확히하기 위해 파인더에서 프로젝트로 드래그하여 클래스를 추가하면 XCode가 클래스를 빌드 단계 목록에 항상 추가하지는 않습니다. 빌드 단계에서 "컴파일 소스"의 "+"버튼을 누르고 문제가되는 모든 파일을 추가 한 후 바로 컴파일했습니다.
— Amos

1
와. Apple은 실제로 오류 메시지를 재고해야합니다.
— devios1

2
이 문제를 해결하는 또 다른 방법은 누락 된 파일을 선택하는 것입니다. "유틸리티"슬라이드 아웃 막대를 엽니 다. (가장 오른쪽입니다) "파일 검사기"를 선택하십시오. 그런 다음 프로젝트의 "대상 멤버쉽"에 확인 표시가되어 있는지 확인하십시오. 나는 엑스 코드 4.6.2를 사용하고 있습니다
— zingle - 깊고 좁은 골짜기

1
어떤 파일이 누락되었는지 몰랐으므로 보조 편집기 (두 번째 편집보기)에서 빌드 단계를 보여주었습니다. 왼쪽 편집보기에서 문제가되는 파일을 열고 가져온 각 파일이 빌드 단계에 존재하는지 확인했습니다. 나는하지 않은 것을 추가하고 해결되었습니다.
— Dan Sandland

38

비슷한 문제가 있었고 각 프로젝트 구성 (디버그, 릴리스 및 배포)과 대상의 빌드 설정에서 "빌드 활성 아키텍처 만"을 확인해야했습니다.


3
또한 나를 위해 트릭을했다. 그래도 주요 프로젝트에 필요했습니다.
— Kirualex

4
나는 같은 문제가 발생합니다. Build Active Architecture Only설정과 다른 Pods내 프로젝트. 링크 단계에서 실패했습니다.
— AechoLiu


14

나는 그것과 비슷한 문제가 있었다. _OBJC_CLASS _ $ _ 다음의 클래스 이름은 실제로 내 클래스였습니다. 그 이유는 소스 코드 파일을 탐색 목록으로 드래그 할 때 "대상에 추가"를 선택하지 않았기 때문입니다.

내 해결책은 다음과 같습니다.

  1. 탐색 목록에서 클래스를 삭제하고 "참조 만 제거"를 선택하십시오.

  2. 소스 코드 파일을 다시 끌어 "대상에 추가"확인란이 선택되어 있는지 확인하십시오. 틱 박스는 "필요한 경우 복사"및 "그룹 생성"바로 아래에 있습니다.


추가하기 : 이것이 오류의 가장 일반적인 원인은 아니지만, 나는 당신의 대답 (상자를 체크하지 않았습니다)이 지금 나에게 일어납니다.
— Adam

8

일반적으로 현재 버전에 연결된 버전 식별자가없는 별칭이 있습니다.이 경우 libz.dylib는 libz.1.2.5.dylib에 연결됩니다. 버전 별명 대신 기본 별명을 사용하십시오.


5

대상-> 빌드 설정-> Apple LLVM 컴파일러 언어에서 'C ++ 언어 방언'및 'C ++ 표준 라이브러리'를 컴파일러 기본값으로 설정하면 문제를 해결하는 데 도움이되었습니다.


5

내 프로젝트에 libz.1.2.5.dylib 만 추가했으며 매력처럼 작동했습니다.

단계 -

  1. 빌드 단계로 이동하십시오.
  2. 바이너리와 라이브러리 연결- '+'버튼을 사용하여 추가 할 프레임 워크와 라이브러리를 선택하십시오.
  3. 목록에서 libz.1.2.5.dylib를 선택하십시오.
  4. 빌드하고 실행하십시오.

5

비슷한 문제가 발생하여 "std ::"와 관련된 오류가 발생했습니다.

빌드 설정-> Apple LVM 5.0-언어 C ++-> C ++ 표준 라이브러리를 변경했습니다.

libc ++ (C ++ 11을 지원하는 LLVM C ++ 표준 라이브러리)에서 libstdc ++ (GNU C ++ 표준 라이브러리)까지


5

admob 라이브러리를 사용할 때도 같은 문제가 발생했습니다. 64 비트를 포함하지 않고 "아키텍처"를 "표준 아키텍처 armv7, armv7s"로 변경했습니다. 빌드 설정


4

.h 파일에 여러 @interfaces가 있으며 해당 @implementation 지시문을 모두 포함하지 않았습니다. 그것들이 모두 균형을 이루는 지 확인하십시오.


4

-ObjC대상> 빌드 설정> 기타 링커 플래그 아래 에 플래그 가 있고이 문제가 발생하면 제거하십시오. 일반적으로로드되지 않는 정적 라이브러리 (Ob, Obj-C 범주)에서 일부 Obj-C 코드를로드해야하기 때문에 의도적으로 추가 한 경우 -force_load <path>대신을 사용해야 합니다 -ObjC.

<path>Xcode 프로젝트 디렉토리와 관련이 있어야합니다. 디렉토리 구조가 다음과 같은 경우 IE :

iOSProject
  + iOSAPI.framework
      + iOSAPI
  + iOSAPI.xcodeproj

그런 다음이 플래그를 설정해야합니다 Other Linker Flags.

-force_load iOSAPI.framework/iOSAPI

그런 라이브러리를 여러 개 포함하려면 각 라이브러리 -force_load마다 별도의 줄을 포함해야 합니다.

-force_load iOSAPI.framework/iOSAPI
-force_load another.framework/another

4

이 문제가 발생하는 방법은 다음과 같습니다.

다른 프로젝트에서 .h, .m 및 NIB를 프로젝트 탐색기로 드래그하여 추가했습니다. Xcode가 빌드 단계에 올바르게 추가하지 않았습니다.

몇 가지 단계를 수행하여 해결할 수있는 비슷한 문제가 있었으므로 대답을 확인 하십시오.


3

iOS5 업그레이드를 처리하는 경우 대상 4.3으로 작성된 프로젝트를 컴파일하기 위해 프로젝트 탐색기에서 libz.1.2.3.dynlib의 이름을 libz.1.2.5.dynlib로 바꾸고 컴파일 할 수 있음을 알았습니다.

내 iPhoneOS50SDK / usr / lib 폴더에는 libz.1.2.3.dynlib가 없습니다. 베타 버전인지 아니면 자연스러운 업그레이드인지 모릅니다.


3

프로젝트로 이동하여 빌드 단계, 소스 컴파일, GameCenterManager.m 추가를 목록에 클릭하십시오.


3

아마도 일부 클래스가 목표에서 누락되었습니다. 일반적으로 프로젝트에 새 클래스 파일의 이름을 바꾸거나 제거하거나 추가 할 때 발생합니다. 수정하려면 새로 추가 한 클래스를 일부 대상에 추가하십시오.

프로젝트 네비게이터 (오른쪽 사이드 바)에서 클래스를 선택하고 유틸리티 사이드 바 (오른쪽 사이드 바)를 열고 유틸리티에서 파일 관리자 (파일과 같은 아이콘)를 선택한 다음 대상 멤버십 탭에서 대상을 선택하십시오. 이것은 "참조 제거"를 피하고 "대상에 추가"를 선택하여 다시 추가하는 것입니다.

그래서 : 선택 클래스 -> 유틸리티 (파일 관리자) -> 대상 회원 -> 틱 원하는 목표.


2

여기 에이 제안을 찾지 못했습니다. 프로젝트에 둘 이상의 대상 (예 : OSX 및 iOS 용)이있는 경우 각 대상에 대한 관련 라이브러리 를 연결해야합니다 . 예를 들어 필자의 경우 AudioToolbox가 필요했습니다. OSX 용으로 한 번, iOS 용으로 한 번 추가해야했습니다 ( 프레임 워크 폴더 아래 에 각 대상에 대해 각 라이브러리의 복제본이 있어야합니다.


이 답변이 도움이되었습니다. 그러나 내 상황은 훨씬 간단했습니다 ... 코드베이스가 참조하는 프레임 워크를 추가하는 것을 잊어 버렸습니다. 필자의 경우 AVFoundation.framework를로드하지 못했습니다.
— John Erck

그렇다. 나는 단순히 "바이너리와 바이너리 링크"단계에서 프레임 워크를 추가하는 것을 잊었다.
— Max

2

PJSIP 라이브러리에 문제가 있습니다.

프로젝트의 다른 링커 플래그에서 다음을 시도하고 오류를 해결할 수 있습니다. -framework Foundation -framework UIKit

위 링커 플래그는 Siphone Project over github 에서 사용됩니다 . 이 설정은 C ++ 라이브러리 연결과 관련된 문제를 해결하는 데 도움이됩니다.


PJSIP 라이브러리와 같은 문제가 있습니다. 솔루션에 대해 자세히 설명해 주실 수 있습니다
— Rajat Jain

프로젝트 빌드 설정의 다른 링커 플래그에서 다음 값을 설정하십시오. -framework Foundation -framework UIKit
— Adeesh Jain

오류 메시지 : 파일 /Users/user/Downloads/pjproject-2.7.2/pjsip-apps/src/pjsua/ios/libyuv.a를 무시하고 파일이 링크 된 아키텍처가 아닌 아카이브 용으로 빌드되었습니다 (i386) : / Users /user/Downloads/pjproject-2.7.2/pjsip-apps/src/pjsua/ios/libyuv.a 아키텍처 i386에 대해 정의되지 않은 기호 : "_pjsip_register_method", 참조 :
— Rajat Jain

시뮬레이터에서 앱을 실행하려고하는 것처럼 보이고 libyuv.a는 시뮬레이터 아키텍처 i386을 위해 제작되지 않았습니다. 기기에서 앱을 직접 실행 해보세요
— Adeesh Jain

Pjsip을 Swift에 통합하고 싶습니다. 브리징 헤더를 만들려고했지만 작동하지 않았습니다. 나에게 아이디어를 줄 수 있습니까?
— Rajat Jain

1

마지막으로 알아 냈습니다. 대상-> 빌드 단계-> 바이너리와 라이브러리 연결에 프레임 워크가 없음을 추가 하여이 문제를 해결했습니다.


1

한때이 문제가있었습니다. 수업을 옮길 때 .mm파일을 덮어 썼다는 것을 깨달았습니다..h 때 대상 폴더 파일을 .

해당 문제를 해결하면 오류가 해결되었습니다.


1

'C ++ 표준 라이브러리'에 대한 대상 빌드 설정이 'libc ++'(프로젝트가 C ++ 11의 일부 기능을 사용하기 때문에 필요함)로 설정된 프로젝트를 컴파일하려고 할 때 '아키텍처 armv7 :에 대한 정의되지 않은 기호'오류가 표시되었습니다. 이 프로젝트에는 동일한 설정이 'libstdc ++'(또는 현재 컴파일러 기본값)로 설정된 하위 프로젝트가 포함되었습니다.

하위 프로젝트의 'C ++ 표준 라이브러리'설정을 libc ++로 변경하면 하위 프로젝트의 배포 대상을 5.0 이상으로 설정 한 후에 만 ​​수정되었습니다 (libc ++에는 5.0이 필요함).


1

다른 일반적인 제안이 도움이되지 않는 경우 확인할 수있는 제안을 더 제공합니다.

다른 프로젝트 (libxxx.a)와 연결하면 때로는 nm와 같은 도구로 기호를 찾을 수 있지만 ld에서 기호를 찾을 수없는 이상한 문제가 발생할 수 있습니다. 그런 다음 두 프로젝트가 동일한 플래그로 빌드되어 있는지 확인해야하며 일부 프로젝트는 이진 형식에 영향을 줄 수 있습니다.

  1. C ++ 컴파일러를 확인하십시오.
  2. C ++ 방언 설정을 확인하십시오.
  3. C ++ 런타임 유형 지원을 확인하십시오. (-frtti / -fnortti)
  4. 다른 곳에 동일한 이름의 .a가 있는지 확인하십시오. 링크 경로 목록에서 원하는 파일을 벗어날 수 있습니다. 그것들을 제거하십시오.

1

iphone5s 에서 앱을 실행할 때이 문제가 발생 했습니다 . 아키텍처 에 arm64 를 추가 하여 해결했습니다 .


1

나는 같은 문제가 있었다. 나는 거대한 답변 목록에서 모든 것을 시도했지만 결국 내 문제는 : openCV로 작업하고 있으므로 코드에 C ++ 코드를 결합해야합니다. 이렇게하려면 objective-c 및 C ++를 사용하는 파일을 .mm로 변경해야합니다. 하나의 파일을 변경하지 않았으며이 파일은 C ++ 코드에 연결되어 있지 않지만 변경해야했습니다.


1

shareKit을 설치할 때이 문제가 발생했습니다. 시뮬레이터에서는 작동했지만 장치에서는 작동하지 않았습니다. Other Linker Flag 에서 -all_load를 제거 했으며 시뮬레이터와 iPhone 장치에서 모두 정상적으로 작동합니다.


1

필자의 경우 Objective C ++을 사용해야하는 프레임 워크를 추가했습니다. 이 게시물을 찾았습니다.

XCode .m 대 .mm

Objective-C ++ 클래스도 컴파일 할 수 있도록 main.m의 이름을 main.mm로 바꾸는 방법을 설명했습니다.

그것은 나를 위해 그것을 고쳤다.



1

나에게 문제는 .m (구현) 에서 상수 값을 설정 하는 것을 잊었다 는 것입니다.

file const kFooKey = @"Foo";

1

또한 끌어서 놓기를 통해 파일을 추가했습니다. 내가 한 일은 모든 파일에 대한 참조를 제거하고 (제외 frameworks) 프로젝트에 파일 추가 옵션 을 통해 올바르게 다시 추가했습니다 . 문제가 사라졌습니다.


1

Unity3D 5에서 빌드하고 Prime31 플러그인을 사용하고 있는데이 오류가 발생하면 .dll이 중복 된 것일 수 있습니다. Unity 에디터에서 경고를 살펴보면 경고 중 하나가 알려주고 빌드 오류가 발생할 수 있음을 경고합니다. 이 경우에 해당하는지 확인하려면 프로젝트 검색 필드에 P31을 입력하면 두 개 이상이 나타날 수 있습니다. 중복은 파일 이름 끝에 '1'이됩니다. 상점 또는 Prime31 메뉴 탭을 통해 편집기에서 플러그인을 업데이트했기 때문일 수 있습니다.

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