Xcode 빌드 실패“아키텍처 x86_64에 대한 정의되지 않은 기호”


168

Xcode 초보자의 질문 :

Xcode 4.6.3에 대한 나의 첫 경험입니다.

페어링 된 BT 장치를 검색하여 NSLog에 인쇄하는 매우 간단한 콘솔 프로그램을 작성하려고합니다.

다음 오류로 빌드됩니다.

Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_IOBluetoothDevice", referenced from:
      objc-class-ref in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

나는 미친 것처럼 검색했다. 일반적인 문제점은 헤더 파일 만 가져오고 링커에서 구현 (* .m-file)을 찾을 수없는 파일에 대한 참조 여야합니다. 그러나 IOBluetooth 라이브러리는 Foundation Framework와 같은 표준 프레임 워크입니다.

위의 진술에서 무엇을 놓치고 있습니까?

또한 32 비트 시스템을 위해 빌드를 시도했습니다 (빌드가 다시 실패 함). 그것은 분명히 링커 오류이지만 x86 및 x64 아키텍처 모두에서 IOBluetoothDevice 구현을 찾는 데 문제가 있다는 것을 제외하고는 링커 오류입니다. IOBluetooth?

귀하의 정보를 위해 내 주요 코드 "main.m"은 다음과 같습니다.

#import <Foundation/Foundation.h>
#import <IOBluetooth/objc/IOBluetoothDevice.h>          // Note the import for bluetooth
#import <IOBluetooth/objc/IOBluetoothDeviceInquiry.h>   // Note the import for bluetooth


int main(int argc, const char * argv[])
{
    @autoreleasepool {
        IOBluetoothDevice *currentDevice;
        NSArray *devices = [ IOBluetoothDevice pairedDevices];


        for (id currentDevice in devices){
          NSLog(@"%i : %@",[ currentDevice classOfDevice ], [ currentDevice name ]);    
        }
    }
    return 0;
}

올바른 방향에 대한 도움이나 조언을 주셔서 감사합니다.


17
다른 링커 플래그 에 추가 $(inherited)하고 청소하고 빌드하십시오.
Resty

1
이 문제가 발생했을 때 m 파일의 파일 검사기로 이동하여 대상 멤버 자격 아래의 확인란을 선택하여 파일을 사용하려는 모듈로 내보내십시오 (?).
랜던 쿤

답변:


123

프로젝트에 IOBluetooth.framework를 포함하여 누락 된 것 같습니다. 다음과 같이 추가 할 수 있습니다.

-왼쪽 창의 왼쪽 위에있는 프로젝트를 클릭하십시오 (파란색 아이콘).

가운데 창에서 Build Phases 탭을 클릭하십시오.

"바이너리와 바이너리 연결"아래에서 플러스 버튼을 클릭하십시오.

목록에서 IOBluetooth.framework를 찾아 추가를 누르십시오.

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

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

이렇게하면 링커가 IOBluetooth.framework 정의를 찾을 수 있습니다. 왼쪽 창에서 프레임 워크를 클릭하고 오른쪽 창에서 프레임 워크의 대상 멤버십을 확인하면 프레임 워크가 대상의 멤버임을 알 수 있습니다 (조직 목적으로 프레임 워크 그룹 아래에서 프레임 워크를 이동했습니다).

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


3
효과가 있었다! 스크린 샷을 찍으려고 노력해 주셔서 감사합니다!
RisingSun

oAuthIOS 프레임 워크에서도 마찬가지입니다. pods 폴더에서 oAuthIOS 프레임 워크를 빌드하려는 루트 프로젝트에 추가
prodeveloper

1
IOBluetooth.framework를 찾고 있지만 거기에 없습니다 : S
Menno van der Krift

이상하다, 거기 있어야한다.
Chris Livdahl 2018

대박! 시간을 절약했습니다!
브라보 케빈

49

UPD

Apple arm64 아키텍처 를 사용해야 합니다 . 프로젝트에서 x32 라이브러리를 사용하지 마십시오

따라서 아래 답변은 더 이상 정확하지 않습니다!


이전 답변

새로운 Xcode 5.1은 아키텍처 armv7, armv7s 및 arm64 를 기본값으로 설정합니다.

때로는 "빌드 실패"아키텍처 x86_64에 대한 정의되지 않은 기호 "" 오류 가 발생할 수 있습니다. Apple의 일부 라이브러리는 원래 x32 용으로 컴파일되었으며 x64를 지원하지 않기 때문입니다.

따라서 필요한 것은 다음과 같이 프로젝트 대상의 "아키텍처"를 변경하는 것입니다.

NB. Cocoapods를 사용하는 경우 "Pods"대상에 대해 동일한 작업을 수행해야합니다.

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


3
기본적으로 유효한 아키텍처 속성에서 arm64를 제거했습니다. 그런 다음 위와 같이 유효한 아키텍처에 무엇이 있는지 볼 수 밖에 없습니다.
Randika Vishman

@Vishman, 안녕! 좋은 답변이 있습니다 그 사이 커버 차이 Valid ArchitecturesArchitectures.
Aleksey Potapov

iOS 7.1 시뮬레이터에서 프로젝트를 실행하려고 할 때 Xcode 5에서 링크 된 오류가 수정되었습니다. iOS 6.x 시뮬레이터에서는 기본적으로 잘 작동했습니다. thx :)
Zsivics Sanel

@BraveS : arm64 아키텍처를 제거하면 64 비트 장치에서 작동합니까?
Jayprakash Dubey

1
@JayprakashDubey 안녕하세요, 64 비트 지원없이 내장 앱 스토어를 업로드하여 내 앱을 거부했습니다. arm64를 추가하려고 할 때 "빌드 x86_64에 대한 정의되지 않은 기호"오류 빌드 오류가 발생합니다. 아키텍처에서 arm64를 제거하면 그리고 arm64를 유효한 아키텍처에 넣었습니다. 내 앱이 승인 되었습니까 ???
SP Balu Kommuri

31

아키텍처 x86_64에 대한 정의되지 않은 기호 : "_OBJC_CLASS _ $ _ xxx", 참조 : yyy.o의 objc-class-ref

이것은 일반적으로 클래스 "yyy"에서 "xxx"(프레임 워크 또는 클래스 일 수 있음)를 호출하고 있음을 의미합니다. 컴파일러가 "xxx"를 찾을 수 없으므로이 오류가 발생합니다.

네비게이터 창에서 프로젝트 폴더를 마우스 오른쪽 버튼으로 클릭 하고 "" YourProjectName " "에 파일 추가 옵션 탭하여 누락 된 파일 (이 경우 "xxx")을 추가해야합니다 .

팝업 창은 Finder에서 프로젝트 파일을 엽니 다. 여기서 누락 된 파일을보고 프로젝트에 추가하면됩니다. " 필요한 경우 항목 복사 "상자 를 반드시 체크하십시오 . 행운을 빕니다!!


17

파생 데이터가 손상되면 Xcode 7.2 에서이 오류를 보았습니다 (제 경우에는 빌드를 중단하고 근본 원인이라고 생각합니다).

따라서 다른 솔루션 (특히 Chris와 BraveS가 더 가능성이 있다고 생각되는 경우)이 문제에 맞지 않으면 파생 데이터 (선택 : Window / Projects / Derived Data-> Delete)를 삭제하고 다시 작성하십시오.

(다른 사람들이 참조 할 수 있도록 추가됨-원래 질문에 올바르게 답변되었음을 알고 있습니다)


14

Xcode 9.0b5에서는 Xcode 9.0b5에 소스 코드를 추가 할 때 대상 설정을 준수하지 않는 버그가 있으므로이 문제가 발생할 수 있습니다. 들어가서 각 파일의 대상을 수동으로 설정해야합니다.

수동 대상 멤버십 일러스트가있는 Xcode 프로젝트


13

제 경우에는 도서관이 아니고 일부 수업이었습니다.

x86_64 아키텍처에 대한 정의되지 않은 기호 :
"_OBJC_CLASS _ $ _ ClassNmae", 참조 : SomeClassName의 objc-class-ref ".

d : 아키텍처 x86_64에 대한 심볼을 찾을 수 없음

clang : 오류 : 종료 코드 1에서 링커 명령이 실패했습니다 (호출을 보려면 -v 사용).

해결 방법 Xcode에는 여러 스키마 (Production, Dev 등)가있는 여러 대상이 있습니다. 새로 추가 된 구현 중 일부 (Class.m)가 누락되었습니다.

Xcode-> 대상-> 빌드 단계-> 컴파일 소스

그래서 수동으로 추가해야했습니다.

그런 다음 성공적으로 컴파일 및 빌드 할 수 있습니다.


이것은 내 문제를 해결했습니다. 동적 프레임 워크를 사용하고있었습니다. 또 다른 것은 아이디어를 수동으로 추가하는 것을 좋아하지 않는다는 것입니다.
toxicsun

9

나는 또한 같은 문제가 발생, 위의 방법은 작동하지 않습니다. 실수로 다음 디렉토리의 파일을 삭제했습니다. 여기에 이미지 설명을 입력하십시오

또는

~ / 라이브러리 / 개발자 / Xcode / DerivedData /

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


4
실제 경로 / 명령이 무엇인지 궁금한 사용자에게는 ~/Library/Developer/Xcode/DerivedData/ CLI를 통해 다음과 같이 디렉토리를 정리할 수 있습니다.rm -rf ~/Library/Developer/Xcode/DerivedData/
Bramus

6

Xcode 7.1로 업데이트 할 때 이러한 유형의 오류가 표시 될 수 있으며 위의 답변으로 해결할 수 없습니다. 필자의 경우 증상 중 하나는 앱이 시뮬레이터가 아닌 장치에서 실행된다는 것입니다. 아마도 사용중인 거의 모든 프레임 워크와 관련된 엄청난 수의 오류가 표시 될 것입니다.

수정은 실제로 매우 간단합니다. 대상> 빌드 설정> 검색 경로 섹션에있는 "프레임 워크 검색 경로"설정에서 항목을 삭제하기 만하면됩니다 ( "모두"탭이 선택되어 있는지 확인)

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

기본 대상 또는 테스트 대상에 대해 $ (상속 된 항목 외에)에 다른 항목이 표시되면 모든 대상에서 잘못된 경로를 삭제하고 다시 빌드하십시오.


5

Objective-C 파일이있는 폴더를 프로젝트로 드래그하면이 문제가 발생할 수 있습니다. 해당 폴더가 파란색으로 표시되면 제대로 연결되지 않은 것 같습니다. 새 파일을 추가 할 때마다 pbxproj 파일이 해당 새 파일에 대한 링크로 업데이트되어야하기 때문에이를 확인할 수 있습니다 (버전 제어를 사용하는 경우). 그러나 pbxproj 파일이 변경되지 않은 폴더를 추가 한 후 링크 오류가있을 수 있습니다. 따라서 자동 완성 작업을 수행하고 가져온 클래스를 찾을 수 있지만 실제로 이미지를 빌드하면이 오류 코드로 실패합니다.

해결책은 폴더를 추가하는 것이 아니라 파일을 추가하는 것입니다. 이렇게하면 pbxproj 파일 업데이트가 표시되고이 오류를 수정해야합니다.

또한 위에서 제안한 작업을 수행했으며 모든 올바른 프레임 워크를 올바르게 연결했다고 가정합니다.


5

나는 여기서 거의 모든 것을 시도했지만 내 문제는 이전 cocoapods 빌드의 잔재로 판명되었습니다. 나를 위해 일한 것은 다음과 같습니다.

  1. rm -Rf Pods; pod install
  2. 파생 데이터 삭제 (창 / 프로젝트 ... 대상을 선택하고 삭제 버튼을 클릭)
  3. 재건

4

파일을 삭제하는 대신 참조를 제거했기 때문에 동일한 오류가 발생했습니다. Finder에서 파일을 찾아서 제거하면 도움이되었습니다.


3

나는 그것이 오래된 질문이라는 것을 알고 있지만 오늘은 같은 오류가 발생했으며 위의 해결책 중 어느 것도 효과가 없었습니다.

그러나 옵션을 설정하여 수정했습니다.

Project -> Architecture -> Build Active Architecture Only

프로젝트 컴파일 및 빌드


3

나는이 문제에 여러 번 직면했다. 일반적으로 빌드 폴더를 삭제할 때 발생합니다.

쉬운 해결책은 포드 파일을 다시 통합하고 다시 설치하는 것입니다.

pod deintegrate
pod install

2

C 파일에 연결하려고 할 때이 오류가 발생하면 먼저 함수 이름에 오타가 있는지 다시 확인하십시오. 다음으로 extern C {}구문 을 사용하지 않고 C ++ / Objective-C ++ 환경에서 C 함수를 호출하려고하지 않는지 다시 확인하십시오 . C 함수를 호출하려고하는 .mm 파일에 클래스가 있었기 때문에 머리카락이 찢어졌습니다. C ++에서는 기호가 엉망이기 때문에 작동하지 않습니다. 실제로 nm 도구를 사용하여 생성 된 콘크리트 기호를 볼 수 있습니다. .o 파일의 경로에 대한 터미널로, nm -g심볼을 호출하는 파일과 심볼을 가져야하는 파일에서 실행 되며, 파일이 일치하는지 여부를 확인해야합니다.

nm -g file.o

다음과 같이 얽힌 C ++ 기호를 검사 할 수 있습니다.

nm -gC file.o

2

필자의 경우 배포 대상을 9.1로 설정 한 사용자 지정 프레임 워크를 만들었지 만 내 앱의 배포 대상이 낮아서 8.1을 지원합니다. 사용자 지정 프레임 워크 최소화 배포 대상에서 내 문제를 해결했습니다.


2

나는 파티에 늦었지만 이것이 일어날 수있는 시나리오를 하나 더 공유 할 생각이었습니다. 나는 프레임 워크에서 일하고 있었고 cocoapods에 배포하고있었습니다. 이 프레임 워크에는 객관적인 c 클래스와 신속한 클래스 및 프로토콜이 모두 있으며 성공적으로 구축되었습니다. 다른 프레임 워크 또는 프로젝트에서 포드를 사용하는 동안 podspec에 .m 파일을 포함하는 것을 잊었을 때이 오류가 발생했습니다. 다음과 같이 podspec 소스에 .swtift, .h 및 .m 파일을 포함하십시오. s.source_files = "Projectname / Projectname / ** / *. {swift, h, m}"

다른 사람의 시간이 절약되기를 바랍니다.



1

나에게 이것은 병합 충돌 후에 일어났다.

빌드 폴더를 정리하고 제거하려고 시도했지만 아무것도 도움이되지 않았습니다. 이 문제는 관계없이 계속 발생합니다. 그런 다음 문제가 있고 프로젝트에 다시 추가 한 그룹을 삭제하여 참조를 다시 연결했습니다.



1

내 경우에는 추가해야했습니다

    target 'SomeTargetTests' do
        inherit! :search_paths
    end
내 podfile로 이동 한 다음 / Pods 디렉토리를 삭제하고`pod install`을 실행하십시오.

(Xcode 10.1)


1

이것은 누군가를 도울 수 있습니다. 마침내 알아내는 데 며칠이 걸렸습니다. OBJ-C에서 일하고 있는데

Project-> Build Phases-> 방금 추가 Compile sources한 새 VC.m파일을 추가했습니다.

레거시 코드로 작업하고 있으며 일반적으로 OBJ-C에 익숙하지 않아서 .m파일을 소스 라이브러리로 가져올 생각조차하지 않았습니다 .

편집하다:

이 문제에 두 번째로 뛰어 들었고 다른 것이 었습니다. 이 답변은 5 시간의 디버깅 후 저를 구했습니다. 이 글타래 등의 모든 옵션을 시험해 보았습니다. https://stackoverflow.com/a/13625967/7842175 이것이 도움이된다면 크레딧을 제공하십시오. 그러나 기본적으로 파일 관리자에서 파일을 대상으로 설정해야 할 수도 있습니다.

이것은 파일 관리자입니다. 필요한 모든 대상이 "틱"되어 있는지 확인하십시오.

대체로 이것은 여러 가지 이유로 발생할 수있는 매우 모호한 오류 코드이므로 다른 옵션을 계속 시도하십시오.


1

언젠가 Release-universal에서 라이브러리를 복사하고 Release-iphoneos에서 실수로 복사하는 것을 잊어 버렸습니다. 일반적으로 Release-iphoneos에는 X86 용으로 정리 된 .a 파일이 있습니다. 그래서 오류가 발생합니다.


1

내 경우 에는 대상 멤버십 선택제거한 다음 다시 선택 하여 문제를 해결하십시오.

첨부 파일 사진으로 William Cerniuk의 답변을 확인하십시오.


0

필자의 경우 문제는 컴파일 된 프레임 워크 아키텍처였습니다. Xcode 11을
실행 중이며 Swift 5.1을 사용하고 있습니다.

  • 나는 다음과 같은 3 가지 목표를 가졌다.
    • MyApp
    • MyAppTests
    • MyAppFrameWork

테스트를 실행하려고 시도했지만 MyAppFrameWork 제품은 일반 iOS 장치 용 으로 컴파일 되었고 테스트 대상에는 x86-64 암이 필요했습니다. 따라서 iOS 시뮬레이터 용 프레임 워크를 다시 빌드하고 테스트 케이스가 성공적으로 실행됩니다.

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