programing

Xcode 빌드 오류 "아키텍처 x86_64에 대한 정의되지 않은 기호"

subpage 2023. 4. 29. 09:19
반응형

Xcode 빌드 오류 "아키텍처 x86_64에 대한 정의되지 않은 기호"

Xcode 초보자 질문:

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

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

빌드 시 다음 오류가 발생합니다.

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;
}

올바른 방향으로 도움을 주거나 조언을 해주셔서 감사합니다.

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

  • 왼쪽 창(파란색 아이콘)의 왼쪽 상단에 있는 프로젝트를 클릭합니다.

  • 가운데 창에서 빌드 단계 탭을 클릭합니다.

  • "라이브러리와 이진 연결"에서 더하기 단추를 클릭합니다.

  • 목록에서 IOBluetooth.framework를 찾고 Add를 누릅니다.

여기에 이미지 설명 입력

여기에 이미지 설명 입력

이렇게 하면 IOBluetooth.framework 정의가 링커에서 발견됩니다.왼쪽 창에서 프레임워크를 클릭하고 오른쪽 창에서 프레임워크의 대상 구성원 자격을 확인하면 프레임워크가 대상의 구성원임을 알 수 있습니다(참고: 조직 목적으로 프레임워크 그룹 아래에서 프레임워크를 이동했습니다).

여기에 이미지 설명 입력

업데이

Applearm64 아키텍처를 사용해야 합니다.프로젝트에서 x32 라이브러리 사용 안 함

그래서 아래의 답은 더 이상 맞지 않습니다!


구답

새로운 Xcode 5.1은 아키텍처 암v7, 암v7 및 암64를 기본값으로 설정합니다.

때때로 "빌드 오류 "Undefined symbolics for Architecture x86_64"가 원인일 수 있습니다.왜냐하면 일부 립(Apple의 립이 아닌)은 원래 x32용으로 컴파일되었으며 x64를 지원하지 않기 때문입니다.

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

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

여기에 이미지 설명 입력

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

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

탐색기 창에서 프로젝트 폴더를 마우스 오른쪽 단추로 클릭하고 "프로젝트 이름에 파일 추가" 옵션을 눌러 누락된 파일(이 경우 "xxx")을 추가해야 합니다.

팝업 창이 열리고 Finder에서 프로젝트 파일이 열립니다.그러면 누락된 파일을 보고 프로젝트에 추가할 수 있습니다.필요한 경우 항목 복사 상자를 선택하는 것을 잊지 마십시오.행운을 빌어요!!

파생 데이터가 손상되었을 때 Xcode 7.2에서도 이 오류가 발생한 적이 있습니다(내 경우 빌드를 중단하고 근본 원인으로 의심됩니다).

따라서 다른 솔루션(특히 Chris 및 BraveS)이 문제에 맞지 않는 경우 파생 데이터(선택: Window / Projects / Derived Data -> Delete)를 삭제하고 재구축해 보십시오.

(다른 사용자가 참조할 수 있도록 추가됨 - 원래 질문에 올바르게 답변한 것으로 알고 있습니다.)

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

수동 대상 멤버쉽 그림이 있는 Xcode 프로젝트

나의 경우, 그것은 도서관이 아니라 몇몇 수업이었습니다.

아키텍처 x86_64에 대한 정의되지 않은 기호:
. . . $_ClassNmae", . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

d: 아키텍처 x86_64에 대한 기호를 찾을 수 없습니다.

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

솔루션 Xcode에 여러 개의 스키마(운영, 개발 등)가 포함된 대상이 있습니다. 새로 추가된 구현(Class.m) 중 일부가 누락되었습니다.

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

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

성공적으로 컴파일하고 빌드할 수 있었습니다.

나도 같은 문제에 직면했는데, 위의 방법들은 작동하지 않을 것입니다. 나는 실수로 그것의 아래 디렉터리에 있는 파일들을 삭제했습니다.

또는

~/도서관/개발자/Xcode/파생데이터/

여기에 이미지 설명 입력

저는 여기서 거의 모든 것을 시도했지만, 제 문제는 이전의 코코파드 건축물의 잔재라는 것이 밝혀졌습니다.저에게 효과가 있었던 것은 다음과 같습니다.

  1. rm -Rf Pods; pod install
  2. 파생 데이터 삭제(창/프로젝트...대상을 선택합니다.Delete 버튼 클릭
  3. 재구축

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

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

pod deintegrate
pod install

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

해결책은 사실 꽤 간단합니다.TARGETS > Build Settings > Search Paths 섹션에 있는 "Framework Search Paths" 설정에서 항목을 삭제하면 됩니다("All" 탭이 선택되었는지 확인).

여기에 이미지 설명 입력

여기에 주 대상 또는 테스트 대상에 대한 다른 항목($(상속됨) 외에)이 표시되면 모든 대상에서 오류가 있는 경로를 삭제하고 다시 빌드하십시오.

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

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

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

오래된 질문인 것은 알지만 오늘도 같은 오류가 발생했고 위의 해결책은 작동하지 않았습니다.

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

Project -> Architecture -> Build Active Architecture Only

프로젝트 컴파일 및 빌드를 적절하게 수행합니다.

이것은 애플 M1 칩에서도 발생합니다.

다음은 Rosetta를 사용하여 열기를 선택하는 솔루션입니다.

  1. application > 오른쪽 클릭 xcode > get info > Open using Rosetta를 선택합니다.
  2. 시스템을 다시 시작합니다.

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

C 파일에 연결하려고 할 때 이 오류가 발생하면 먼저 함수 이름에서 오타를 두 번 확인합니다.은 CC합니다. C C++/Objective-C++를 사용합니다.extern C {}.C하는 .mm 파일에 C 함수를 호출하는 수업이 있어서 머리를 쥐어뜯고 있었습니다.C++에서는 기호가 망가져서 작동하지 않습니다.실제로 nm 도구를 사용하여 생성된 콘크리트 기호를 볼 수 있습니다.파일의 을 지정하고 .o 파일을 합니다.nm -g기호를 호출하는 파일과 기호가 있어야 하는 파일에서 일치하는지 여부를 확인해야 하며, 이는 오류에 대한 단서를 제공할 수 있습니다.

nm -g file.o

C++ 기호를 검사할 수 있습니다.

nm -gC file.o

저의 경우 배포 대상이 9.1로 설정된 사용자 지정 프레임워크를 구축했지만 8.1을 지원하는 앱의 배포 대상이 더 낮았습니다.사용자 지정 프레임워크 최소화 배포 대상을 통해 문제가 해결되었습니다.

빌드 설정의 기타 링커 플래그에 "-lc++"를 추가하여 해결했습니다.

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

나는 그것이 다른 사람의 시간을 절약해주기를 바랍니다.

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

    target 'SomeTargetTests' do
        inherit! :search_paths
    end
to my podfile and then delete the /Pods directory and run `pod install`

(Xcode 10.1)

누군가에게 도움이 될 수도 있습니다.마침내 그것을 알아내는 데 며칠이 걸렸습니다.저는 OBJ-C에서 일하고 있으며, 다음과 같이 갔습니다.

Project->Build Phases->Compile sources그리고 새로운 것을 추가했습니다.VC.m방금 추가한 파일입니다.

저는 레거시 코드로 작업하고 있으며 보통 OBJ-C에 새로 온 민첩한 사람이기 때문에 제 데이터를 가져올 생각조차 하지 못했습니다..m파일을 소스 라이브러리에 저장합니다.

편집:

두 번째로 이 문제에 부딪혔고 다른 문제였습니다.이 답변은 5시간 동안 디버깅을 한 후에 저를 구해주었습니다.이 스레드에서 모든 옵션을 사용해 보았습니다.https://stackoverflow.com/a/13625967/7842175 이것이 당신에게 도움이 된다면 그에게 신용을 주시기 바랍니다, 하지만 기본적으로 당신은 당신의 파일을 파일 검사기에서 그것의 대상으로 설정해야 할 수도 있습니다.

파일 검사자입니다. 필요한 대상이 모두 "선택"되었는지 확인하십시오.

전반적으로 이 코드는 여러 가지 이유로 인해 발생할 수 있는 매우 모호한 오류 코드이므로 다른 옵션을 계속 시도하십시오.

저의 경우 문제는 프레임워크 아키텍처를 컴파일한 것입니다.
는 Xcode 11실행하고 Swift 5.1을 사용하고 있습니다.

  • 다음과 같은 3가지 목표가 있었습니다.
    • 내 앱
    • 내 앱 테스트
    • 내 앱 프레임워크

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

추가하는 데 도움이 된 것은s.static_framework = true나에게/podspec오류를 던진 프로젝트에서.

저는 병합 충돌 이후에 이런 일이 발생하기 시작했습니다.

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

또한 다음과 같은 경우에 따라#include <windows.h>컴파일하려는 .c 파일에 있습니다.

때때로 Release-universal에서 라이브러리를 복사하는 것을 잊어버리고 Release-iphoneos에서 실수로 복사합니다.일반적으로 Release-iphoneos에는 X86용으로 제거된 .파일이 포함되어 있으므로 오류가 발생합니다.

내 경우에는 대상 구성원 자격 선택을 제거한 다음 다시 선택하여 문제를 해결합니다.

첨부된 사진과 함께 William Cerniuk 답변을 확인합니다.

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

사용할 때 이 문제에 대해 실행했습니다.CocoaPods특정 버전이 없는 일부 종속성으로, 그것이 그 이후의 이유입니다.pod update은 몇 사항이 했습니다.

  • 업그레이드 종속성 및 사용 코드
  • 포드의 특정 버전 설정
  • 제다한을 합니다.Derived Data[정보] 폴더

제 경우 다음 오류가 발생했습니다.아키텍처 x86_64에 대한 정의되지 않은 기호: "_OBC_CLASS _ $ _ RCTImageLoader"

그리고 제 Pod 파일에 다음 행을 추가하여 수정할 수 있었습니다.

pod 'React-RCTImage', :path => '../node_modules/react-native/Libraries/Image'

언급

현재 프로젝트에서 Architecture arm6, arm7을 사용하고 있지만 프로젝트에서 사용하려는 타사 프레임워크가 x86_64를 통해 구축된 경우에 발생합니다.

예를 들어 프로젝트에서 코코아 포드를 사용하는 경우 다음 스크립트를 추가하여 모든 타사 프레임워크가 arm6, 즉 arm7을 보장하도록 해야 합니다.

마지막에 추가할 스크립트가 있는 샘플 포드 파일

target 'XYZ_ProjectTarget' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!
  
  # Pods for XYZ_ProjectTarget
  pod 'pod_name'
  
  target 'XYZ_TargetTests' do
    inherit! :search_paths
    # Pods for testing
  end
  
  target 'XYZ_TargetUITests' do
    # Pods for testing
  end
  
end

post_install do |installer_representation|
  installer_representation.project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['ARCHS'] = 'armv7 armv7s'
    end
  end
end

언급URL : https://stackoverflow.com/questions/18408531/xcode-build-failure-undefined-symbols-for-architecture-x86-64

반응형