아키텍처 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.