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

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

    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그리고 도움이되지 않는 사람, 어떤 아이디어가 있습니까?



답변

일반적인 원인

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

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


답변

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

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


답변

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


답변

“정의되지 않은 심볼”링커 오류의 또 다른 원인은 .mm 파일에서 C 함수를 호출하려고 시도하는 것입니다. 이 경우 헤더 파일을 가져올 때 extern “C”{…}를 사용해야합니다.

Objective-C ++에서 C-Function을 호출하는 링커 오류


답변

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

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

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

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


답변

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


답변

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