i386 아키텍처에 대한 정의되지 않은 기호 : _OBJC_CLASS _ $ _ SKPSMTPMessage ", 오류 :


236

백그라운드에서 응용 프로그램에서 전자 메일을 보내기 위해 프레임 워크를 가져 왔습니다 SKPSMTPMessage. 누군가 아래 오류가 표시되는 이유를 제안 할 수 있습니까?

Undefined symbols for architecture i386:

"_OBJC_CLASS_$_SKPSMTPMessage", referenced from:
  objc-class-ref in ConfirmController.o

"_kSKPSMTPPartContentTransferEncodingKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

"_kSKPSMTPPartMessageKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

"_kSKPSMTPPartContentTypeKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status

프레임 워크를 가져 오는 소스 :-

MFMailComposeViewController에서 필드 잠금

최신 정보 :

답 : 프로젝트 위로 폴더를 끌어다 놓고 복사를 클릭하십시오. 그것은 프로젝트 확인란과 대상 확인란도 선택합니다.


빌드 단계 에서 SystemConfiguration.framework 를 추가 한 후 프로젝트가 잘 컴파일됩니다
swiftBoy

이 문제를 해결했습니다. 바이너리를 라이브러리와 연결하기 위해 require 프레임 워크를 추가했습니다.
Mihir Oza

답변:


569

클래스의 .m 파일이 대상의 "빌드 단계"탭의 "컴파일 소스"단계에 나열되어 있지 않으면이 유형의 오류가 발생할 수 있습니다. 일반적으로 Xcode 가이 작업을 수행하지만 플롯이 손실되고 .m 파일을 수동으로 추가해야합니다.

이것을하기 위해:

TargetSettings-> 빌드 단계-> 소스 컴파일-> .m 클래스 추가-> 빌드 및 실행


49
일부 프레임 워크가 제대로 연결되지 않아서 이러한 오류가 나타나는 경우가 있습니다. 프로젝트 빌드 단계 탭의 "이진과 라이브러리 연결"에서 모든 프레임 워크를 확인하십시오.
Heitara

이것은 .c 파일과 아마도 .mm에서도 발생할 수 있습니다.
brodney 2011

Rajneesh, 문제를 해결 했습니까? 그렇다면 어떻게 고치셨습니까?
codematrix

9
.m 파일을 선택하고 오른쪽 패널 "Target Membership"섹션에서 대상 옆에있는 상자를 선택하십시오. 프로젝트에 파일을 추가 할 때 "대상에 추가 :"를 원하는지 묻는 메시지가 표시됩니다. 아니요라고 말했을 수도 있지만, 내가 말한 것을 수행하여 언제든지 추가 할 수 있습니다.
Nicolas S

4
저도 같은 오류를 가지고하는 데 사용, 광산에 대한 솔루션입니다 : 빌드 설정 -> 링크하기 -> 기타 링커 플래그 -> 추가를 -lLibraryName_$(PLATFORM_NAME)d위한 디버그 및 추가 -lLibraryName_$(PLATFORM_NAME)에 대한 릴리스
조지

37

나를 위해이 문제는 프레임 워크가없는 것으로 판명되었습니다. em을 추가하면 효과가 있습니다.


이것은 내가 얻은 오류 메시지와 실제로 일치하지 않기 때문에 긴 샷처럼 보였지만 SocketRocket 사이트에서 제안 된 종속 프레임 워크를 추가하면 나를 위해 수정되었습니다.
Pat

Cocoapod를 통해 프레임 워크를 추가하더라도 이런 일이 발생할 수 있습니다. 프레임 워크로 수동으로 추가해야했습니다. 감사!
FBente

내가 추가 한 프레임 워크는 빌드하기 전에 추가 할 다른 프레임 워크가 필요했습니다. 프레임 워크를 추가하는 경우 필요한 프레임 워크를 추가했는지 확인하십시오
Dave Patrick

29

유효한 아키텍처 및 활성 아키텍처 만 빌드 특성을 확인하십시오.

여기에 이미지 설명을 입력하십시오


1
Xcode 4.2에서이 옵션 창을 여는 방법을 알려주시겠습니까?
Anand

이것이 도움이되지 않으면 아래의 Allen Pike의 답변을 참조하십시오.
MattyG

이 답변과 Allen의 답변 모두 저에게 도움이되었습니다. 컴파일 소스와 빌드 액티브 아키텍처 만 모두 확인해야했습니다. 많은 분들 감사합니다!
Bogdan

@Anand 대상의 빌드 설정에 있습니다.
lifelogger

18

cocoapods를 사용하는 경우 대상의 빌드 설정 에 다른 링커 플래그 섹션 에 $ (상 속됨)이 포함되어 있는지 확인하십시오.

여기에 이미지 설명을 입력하십시오


10

프레임 워크가 armv (x) 용으로 컴파일 되었습니까? iOS 장치에서 실행되지 않는 i386 용으로 컴파일 된 것처럼 보입니다. 또는 armv (x) 용으로 컴파일되어 시뮬레이터 (i386 코드)에서 실행하려고합니다. 위에 표시된 빌드 설정 Akshay를 사용하여 프레임 워크를 실행할 칩에 맞게 프레임 워크가 올바르게 컴파일되었는지 확인하십시오.


정렬되었습니다. 프레임 워크 forlder를 xCode의 프로젝트 forlder로 끌어서 놓아야했습니다. 감사합니다
Mann

iOS 장치와 시뮬레이터에서 동시에 실행되도록 프레임 워크를 어떻게 컴파일 할 수 있습니까? 아니면 항상 하나의 옵션 만 선택해야합니까?
Aleksey Tsyss

동일한 프로젝트에서 두 개의 창을 열고 시뮬레이터에서 실행되도록 설정하고 장치에서 실행하도록 설정하는 것에 대해 이야기하고 있습니까?
Owen Hartnett

7

xcode에서 다른 프로젝트를 가져오고 현재 프로젝트와 가져 오기 프로젝트 모두 컴파일러 소스에 동일한 파일이있는 경우 "빌드 단계"설정에서 현재 프로젝트에서 동일한 파일을 제거하십시오.


4

예, 이것은 앨런의 말과 관련이 있습니다 ... 소스 파일의 유틸리티 섹션에서 TargetMembership을 찾으십시오. 해당 파일을 프로젝트에 연결하는 확인란이 있습니다. 이것을 확인하면이 문제도 해결되었습니다.


다른 모든 설정을 수정했지만 마지막 으로이 설정을 수정했습니다. 감사!
Alec Thomas

4

또한 바이너리 라이브러리에 연결하지 않고 Targes의 Build Phases에서 필요한 라이브러리 추가를 확인한 다음 Product> Clean Product> Build를 확인하십시오.

그것도 작동해야합니다!


4

동일한 프로젝트를 두 번 열 때이 문제가 발생했지만 한 프로젝트 만 원본 프로젝트이고 다른 프로젝트는 자식 URL에서 복제되었습니다.

'Product'> 'Clean'이 문제를 해결했습니다.


4

나는 또한이 문제를 만났고 라이브러리와 컴파일 소스와 링크 바이너리가 필요한 모든 파일 / 라이브러리 / 프레임 워크를 포함하고 있는지 확인하여 문제를 해결했습니다.

여기에 이미지 설명을 입력하십시오


4

이 같은 문제가 발생했을 때 :

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

_OBJC_CLASS _ $ _ SKPSMTPMessage, 참조 : ConfirmController.o의 objc-class-ref

프레임 워크를 추가하는 것을 잊어 버렸습니다. 정확히 QuartzCore.framework였습니다.


@JayprakashDubey Ask Mitch please
D_D

4

마지막으로 시도해보십시오.

이 페이지의 모든 제안을 시도했습니다. 아무 것도 효과가 없었습니다. 문제가 시작된 방식은 자습서 의 단계에 따라 정적 라이브러리를 연결하는 방법을 설명하는 것입니다. 내 샘플 프로젝트에서 지침이 잘 작동했습니다 ..하지만 실제 프로젝트에서 위의 오류가 발생하기 시작했습니다.

그래서 내가 한 것은 위에서 언급 한 튜토리얼 의 각 단계를 거치고 각 단계 후에 작성되었습니다. 문제가되는 행은 다음과 같습니다.

이 플래그는 정적 라이브러리에 카테고리를 링크 할 때 한 번 권장 된 것으로 나타났습니다 . 그러나이 플래그는 더 이상 필요하지 않은 것으로 나타났습니다 . Xcode 4.2 + .. (-force_load 플래그와 동일) 다른 게시물 에서 권장 ).


3

같은 문제가 발생하면 "컴파일 된 버전의 라이브러리 (확장명 .a)"를 추가하는 것을 잊었습니다. 일반적으로 빌드 단계의 대상 종속성에 가져온 프로젝트의 라이브러리를 추가하지만 빌드 단계의 라이브러리와 링크 바이너리에 "컴파일 된 라이브러리"를 추가하는 것을 잊습니다.


3

다른 사람들이 같은 문제를 겪고 여기서 끝나는 경우를 대비하여 나를 위해 일한 것을 추가하십시오. CLANG_ENABLE_MODULES 설정이 No로 설정된 오래된 프로젝트가 있습니다. 몇 시간 동안 좌절 한 후 작업 프로젝트와 비교하여 LLVM 빌드 설정에서 Enable Modules Set을 no로 설정했습니다. 이것을 예로 설정하면 문제가 해결되고 앱이 제대로 빌드됩니다.

프로젝트 설정-> 빌드 설정-> '모듈'을 검색하고 활성화 모듈 (C 및 Objective-C)을 YES로 업데이트하십시오.


멋진 수정! 이것은 나에게 많은 도움이되었습니다! 나는 오래된 포드 프로젝트를 가지고 있었고 새로운 포드를 추가 할 때 마다이 오류가 발생했습니다. 감사!!!
DiscDev

2

빌드 설정에서 "-all_load -lstdc ++"를 다른 링커 플래그에 추가하지 않았으며 오류없이 sim을 시작할 수 있었지만 시작할 때 MonkeyTalk 로그 출력을 얻지 못했습니다. 이제 재생 버튼이 비활성화 된 것으로 표시되었습니다. MT IDE의 출력이 "iOS 시뮬레이터로 설정된 연결"로 표시되었지만 실행 / 재생 버튼을 선택할 수 없습니다.

원래 프로젝트에는 Other Linker Flags에 "ObjC -all_load"가 있고 "-all_load -lstdc ++"를 함께 추가하면이 게시물에 관한 오류 메시지가 나타납니다. "ObjC -all_load"를 제거하고 프로젝트가 빌드 된 "-all_load -lstdc ++"만 추가했지만 여전히 콘솔에서 확인으로 원숭이 토크 로그 아웃이 없음


2

REAL 하드웨어 전용으로 컴파일 된 라이브러리를 사용하고있을 수 있습니다. 예를 들어 Zephyr HxM Smart와 같은 Bluetooth 라이브러리를 사용하는 경우 시뮬레이터에서 컴파일되지 않으며 실제 장치에서만 실행됩니다.


1

IOS 6에서도 비슷한 문제가 발생했습니다. 빌드 단계 섹션의 "라이브러리와 바이너리 링크"에 storekit.framework를 추가하여 문제를 해결할 수있었습니다.

이제는 매력처럼 작동합니다.


1

PSTCollectionviewcontroller를 추가 할 때 7 오류와 동일한 문제가 있습니다.이 문제에 대한 한 가지 해결책은 "xcode-> 빌드 단계-> 컴파일 소스"를 확인하여 여기에 모든 ".m"파일을 추가하는 것입니다. post는 나중에 사용자를 도울 것입니다.


1

필자의 경우 증강 현실 프로젝트에 Cocoapods를 사용하고 있었고 Cocoapod를 구현하고 프로젝트의 .workspace를 열면 Xcode Project 대상과 동일한 파일 내에서 구현 한 포드 대상으로 끝났다는 것을 알았습니다. 무슨 일이 있었는지 .m 중 일부가 둘 다 사용하고있었습니다. Build Phases >> Compile Sources에서 Xcode 대상에 대해 중복 된 것을 제거하면 정상적으로 작동합니다.


1

새 Google 웹 로그 분석 라이브러리로 업그레이드하는 동안이 오해의 소지가있는 메시지를 발견했습니다.

제 경우에는 문제가 라이브러리의 두 가지 상충되는 사본 을 가지고있었습니다 . 그것들은 다른 폴더에 있었지만 둘 다 내 앱의 라이브러리 빌드 경로 (빌드 설정 아래)에 나열되었습니다.

더 이상 사용되지 않는 라이브러리 파일을 폴더 밖으로 옮기면 트릭이 끝나고 신비한 오류 메시지가 사라졌습니다.




1

활성 아키텍처의 변경이 저에게 효과적이었습니다. 내 라이브러리 중 하나가 i386을 사용하고있었습니다.

에서 빌드 설정 >> 변경 만 빌드 액티브 아키텍처 NO에서

그것은 나를 위해 일했다. 그것이 다른 사람들에게도 도움이되기를 바랍니다.

여기에 이미지 설명을 입력하십시오


"아니오에서 예"는 이해하기 쉽습니다. 어쨌든 이것은 효과가있었습니다.
Victor Laerte

0

답은 프로젝트 위로 폴더를 끌어다 놓고 복사를 클릭한다는 것입니다.


0

다른 프로젝트에서 일부 소스 파일을 끌어서 놓으면이 메시지가 나타납니다. 파일을 삭제 한 다음 파일 메뉴에서 "파일 추가 ..."를 통해 추가하면 오류없이 빌드됩니다.


0

NSManagedObject와 비슷한 오류가 있었으며 Core Data를 사용하고 있었지만 빌드 단계-라이브러리와 이진 링크에서 Core Data 프레임 워크가 누락 되었기 때문에 발생했습니다.


SO Sam에 오신 것을 환영합니다. 질문에 대답 할 때는 아직 다른 답변에없는 새로운 통찰력, 연구 또는 코드를 추가하십시오. 다른 답변이 귀하에게 도움이되었다고 단순히 공유하려면 중복 답변을 게시하는 대신 답변에 의견을 올리거나 의견을 말하십시오.
butch

0

프로젝트에 포함되지 않은 기본 프레임 워크가 필요한 타사 라이브러리를 프로젝트에 추가하면 이러한 유형의 오류가 발생할 수 있습니다.

새로 추가 한 라이브러리의 .h 및 .m 파일을 살펴보고 필요한 프레임 워크를 확인한 다음 프로젝트에 해당 프레임 워크를 포함하십시오 (대상> 빌드 단계> 라이브러리와 바이너리 연결).


0

프레임 워크를 제거하고 프로젝트를 정리 한 다음 다시 추가하고 컴파일하십시오. 또는 컴파일 소스에서 xcode에 의해 추가 된 클래스를 제거하고 프로젝트를 정리하고 다시 추가 한 다음 빌드하십시오.


0

이미 삭제 한 파일을 호출하는 모든 뷰 컨트롤러에 매크로를 넣을 수 있습니다.

앱을 빌드 할 때까지 앱에 오류가 표시되지 않으며 .o 파일의 컴파일 단계에서 오류가 발생합니다.

이미 삭제 한 파일을 호출하는 모든 MACRO를 삭제해야합니다.

감사 :)


0

Allan이 수행 한 것 외에도 누락 된 클래스를 추가하면서 @ emdog4의 솔루션을 따르고 Xcode에서 빌드 단계로 이동하고 '라이브러리와 바이너리 링크'아래에서 +를 클릭하고 'CoreData.framework'를 선택하여 Core Data 라이브러리를 추가했습니다. . 이것은 내 오류를 정리

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