Xcode에서 x86_64 아키텍처에 대한 중복 기호


219

나는 위의 제목과 동일한 질문을 받았지만 아직 정답을 찾지 못했습니다. 오류가 발생했습니다.

    /Users/nle/Library/Developer/Xcode/DerivedData/TestMoboSDK-Client-cgodalyxmwqzynaxfbbewrooymnq/Build/Intermediates/TestMoboSDK-Client.build/Debug-iphonesimulator/TestMoboSDK-Client.build/Objects-normal/x86_64/MoboSDK.o
    /Users/nle/Library/Developer/Xcode/DerivedData/TestMoboSDK-Client-cgodalyxmwqzynaxfbbewrooymnq/Build/Products/Debug-iphonesimulator/libMoboSDK.a(MoboSDK.o)
duplicate symbol _OBJC_METACLASS_$_MoboSDK in:
    /Users/nle/Library/Developer/Xcode/DerivedData/TestMoboSDK-Client-cgodalyxmwqzynaxfbbewrooymnq/Build/Intermediates/TestMoboSDK-Client.build/Debug-iphonesimulator/TestMoboSDK-Client.build/Objects-normal/x86_64/MoboSDK.o
    /Users/nle/Library/Developer/Xcode/DerivedData/TestMoboSDK-Client-cgodalyxmwqzynaxfbbewrooymnq/Build/Products/Debug-iphonesimulator/libMoboSDK.a(MoboSDK.o)
ld: 75 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

도움을 주시면 감사하겠습니다.

마지막  으로이 오류의 원인을에 추가 -ObjC했습니다 Other Linker Flags. 이 값을 제거한 후 프로젝트를 성공적으로 빌드 할 수 있지만 그 이유를 모르겠습니다. 누구든지 이것을 설명 할 수 있습니까?


링커에서 정확히 정의 된 기호가 두 번 이상-75 이상 정의되었습니다. 이것은 당신이 무언가 ( #include혹은 #importMoboSDK, 그게 뭐든간에)를 두 번 이상했기 때문일 것입니다.
ravron

이 오류는 GoogleConversionTrackingSDK-iOS-3.0프로젝트에 추가 한 후에 발생합니다.이 오류 는 정상적으로 작동합니다.이를 제거하려고 시도했지만 오류가 계속 발생합니다.
lee

그것은 귀하의 경우가 아닙니다 .Google의 sdk를 추가하기 전에 내 프로젝트를 빌드하십시오.
lee

Adam Waite의 두 번째 대답은 정말 간단합니다. 가져온 파일 인 .m 파일이 없는지 확인하십시오.
Bogdan

필자의 경우 두 개의 별도 클래스에서 동일한 문자열 배열 이름을 사용하려고했습니다. 클래스 중 하나에서 배열 이름을 변경하면이 오류가 제거되었습니다.
Hope

답변:


109

x86_64 아키텍처를위한 75 개의 중복 심볼

동일한 기능을 두 번로드했음을 의미합니다. -ObjC에서 제거한 후 문제가 사라짐에 따라 Other Linker Flags, 기능을로드하는이 두 번 즉,이 옵션의 결과를 :

기술 Q & A에서

이 플래그는 링커가 라이브러리에서 Objective-C 클래스 또는 카테고리를 정의하는 모든 오브젝트 파일을로드하게합니다. 이 옵션은 일반적으로 응용 프로그램에로드 된 추가 객체 코드로 인해 더 큰 실행 파일을 생성하지만 기존 클래스의 범주를 포함하는 효과적인 Objective-C 정적 라이브러리를 성공적으로 만들 수 있습니다.

https://developer.apple.com/library/content/qa/qa1490/_index.html


1
즉, xcode 프로젝트에서 객체 파일을 제거해야합니다.
쇄골의 가상의

5
그것은 또한 나를 위해 작동하지만 내 다른 라이브러리는 -ObjC플래그에 의존합니다 . 따라서 프로젝트 설정에이 플래그를 유지해야합니다. 다른 해결책을 제안 해 주시겠습니까?
Sunil Targe

3
모든 라이브러리를 검토해야한다고 생각합니다. 링커 오류가 발생하면 2 개 이상의 라이브러리에 동일한 소스 코드가 있음을 의미합니다.
David V

나는 그것이 Target-에서 불평했다 반작용 라이브러리의 일부를 제거했다> 빌드 Phases-> 링크 바이너리와 라이브러리는 엑스 코드에서 내 코코아 포드의 설치를 충돌 이후 반작용
코티 엠브리

제 경우에는 .m 파일을 가져 왔습니다. 멍청한 실수 야 .h 파일을 가져 오면 구축 준비 완료 !! 감사합니다
Ravi

261

나를 위해 'No Common Blocks'를 Yes에서 No로 변경하면 (대상-> 빌드 설정-> Apple LLVM-코드 생성에서) 문제가 해결되었습니다.


3
이것은 내 문제를 해결했습니다. 다시 변경해야 NO합니까? 이것의 이유는 무엇입니까?
Hemang

3
예, 이것은 문제를 해결하지만 그 이유는 아닙니다. const를 정의한 경우 definiton이 정상인지 확인하십시오. 제 경우에는 단순히 "외국인"을 잊었습니다. 이것은 Sauvik Dolui 답변에 언급되어 있습니다.
coco

10
엑스 코드 8은 자동 업데이트 중 하나로이 변경하라는 메시지가 내 빌드 파산 : /
pkamb

1
2 시간을 보낸 후이 답변으로 인해이 문제가 해결되었습니다. 감사합니다
Manish Pathak

1
이 작품은,하지만 대상 및 프로젝트에 변경했다
Nooblhu

251

어리석은 일이지만 실수 #import.m파일을 편집 하지 않았는지 확인하십시오.


3
나는 이것을하지 않았지만이 솔루션은 내가 실수로 .h 파일에서 @interface 블록 외부의 변수를 선언하는 것을 찾도록 도와주었습니다.
스쿠터

단위 테스트를 사용하면 .m 파일 만 생성됩니다. 이것이 최선의 해결책은 아니라고 생각하지만 헤더 파일을 만들었습니다. 기본 테스트 클래스를 만들고 싶었습니다.
Bruno Muniz

내가 그런 바보 같은 실수를 저지른 가능성에 대해 내 마음을 밝게 해주셔서 감사합니다.
Daniel Lima

프로젝트 간 가져 오기 .m 파일은 어떻습니까?
noveleven

54

필자의 경우 다음과 같이 상수 문자열을 정의하기 위해 헤더 파일을 만들었습니다.

NSString *const AppDescriptionString = @"Healthy is the best way to keep fit";

나는 다음을 사용 하여이 시나리오를 해결했다 static.

static NSString *const AppDescriptionString = @"Healthy is the best way to keep fit";

2
이것은 나를 위해 문제를 해결했습니다. 비록 내가 extern대신에 접두어를 붙 였지만 static: extern NSString * const kNotificationName;. u는 보통 그런 접두사를 추가하지 않았기 때문에 이상합니다.
user1244109

이것은 어떤 이유로 든 내 문제를 해결했습니다. 감사. 컴파일러가 중복 기호보다 더 나은 응답을 줄 수없는 이유를 이해하지 못합니다.이 기호는 전혀 관련이없는 것 같습니다.
사이렌

@Sirens, 나는 또한 LLVM 컴파일러에서 더 나은 오류 메시지를 기대했습니다. 어쨌든 나는 2 일 후 오류를 알 수있을만큼 운이 좋았습니다. :(
Sauvik Dolui

이것은 또한 내 문제 였고 실제 문제는 왜 이것으로 인해 발생합니까?
Fatlad

모든 변수 AppStrings.h가 상수 인 경우에는 문제가 없지만, 헤더 파일을 포함하는 모든 소스 파일에 고유 한 변수 사본이 있으므로 전역 변경 가능 변수를 원하는 경우 동작이 발생할 수 있습니다. 나쁜 해결책입니다.
trojanfoe

32

승인 된 답변이 문제에 관한 것으로 나타 났지만 문제를 해결하는 데 도움이되지 않았습니다.이 답변이 매우 실망스러운 문제에 도움이되기를 바랍니다.

duplicate symbol _OBJC_IVAR_$_BLoginViewController._hud in:

17 duplicate symbols for architecture x86_64

"같은 함수를 두 번로드했음을 의미합니다. 다른 링커 플래그에서 -ObjC를 제거한 후 문제가 사라 지므로이 옵션으로 인해 함수가 두 번로드됩니다."

평신도의 관점에서 이것은 프로젝트에 정확히 동일한 이름을 가진 두 개의 파일이 있음을 의미합니다. 어쩌면 한 프로젝트를 다른 프로젝트로 결합하고 있습니까? "중복 심볼"오류 위의 오류를 살펴보고 어떤 폴더가 복제되는지 확인하십시오. 제 경우에는 BLoginViewController였습니다.

예를 들어 아래 이미지에서 두 개의 BImageViewController가 있음을 알 수 있습니다.이 문제의 원인입니다.

하나를 삭제하자마자 문제가 사라졌습니다 :)

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


2
큰 도움, 감사합니다. cocoapod를 사용하는 프로젝트를 백업했습니다. Xcode에서 백업을 다시로드 할 때 작업 공간을 열어야한다는 것을 잊어 버렸고 빌드되지 않을 것이라는 것을 알게 된 후 AFNetworking을 프로젝트에 직접 추가했습니다. 그 후 AFNetworking을 종속성으로 포함하고 프로젝트에 추가 한 원래 AFNetworking 폴더를 제거하는 것을 잊어 버린 cocoapods를 다시 설정했습니다.
JanB

32

나는 같은 문제가 있습니다. 프로젝트 대상> 빌드 설정> 공통 블록 없음 경로의 Xcode 7.2에서 NO로 변경합니다.


4
이것은 내 문제였다. Xcode 8이 설정 한 설정이었습니다. 감사!
Robert J. Clegg

30

다른 클래스에서 동일한 이름을 가진 const 변수를 선언 할 때도 발생합니다.

Message.m 파일에서

const int kMessageLength = 36;

@implementation Message

@end

파일 Chat.m에서

const int kMessageLength = 20;

@implementation Chat

@end

1
아니 CONST하지만 변수 이름을 변경할 때 그것은 나를 위해 일한
Oktay

나는 두 개의 다른 클래스의 @implementation에 정의 된 내 자신의 클래스 변수에 대한 포인터로 이것을 가지고 있었다
ammianus

컴파일시 컴파일러는 헤더 (.h) 파일에서만 중복 기호 (여기서는 전역 변수)를 확인합니다. 그러나 연결시에 구현에서 (글로벌) 변수 (하는 .m) 파일도 확인되고 중복이있는 경우, 링커 것이다 오류를 통해 : 중복 기호 _xyz
판 카즈 VERMA

30

이것은 Objective-C에서 2 년 전에 개발 한 프로젝트에서 "권장 설정"팝업을 수락했을 때 발생했습니다.

문제는 "권장 설정"업데이트를 수락하면 Xcode가을 (를) 포함한 일부 빌드 설정을 자동으로 변경하거나 추가했다는 것 GCC_NO_COMMON_BLOCKS = YES;입니다.

이로 인해 duplicate symbol업데이트 된 프로젝트에서 오류가 발생 하여 빌드가 실패했습니다 . 내가 변경 그래서 No Common BlockNO내 빌드 설정과 오류가 사라졌다.


3
그래, 이것은 나를 도왔다. Xcode 8은 이전 프로젝트를 권장 설정으로 업데이트했습니다. 이것을 다시 바꾸었고 다시 가도 좋습니다. 감사!
Zoltán

2
잘 했어. 많은 도움이되었습니다! 당신을 위해 최대 투표! ;-)
Helen Wood

1
화려한 친구 :)
Burf2000

16

복제본을 찾는 가장 빠른 방법은 다음과 같습니다.

  1. 대상으로 이동
  2. 빌드 단계로 이동
  3. 컴파일 소스로 이동
  4. 중복 파일을 삭제하십시오.

세상에, 이건 내 사건이야, 고마워! 지금 나는 당신에게 내 인생과 맥주 몇 시간을 빚지고 있습니다 :)
Miroslav

1
천만에요,하지만 감사합니다. :) 행복한 코딩.
J. Goce

그것에 몇 시간 더 추가하십시오.
CJ_COIMBRA

나를 위해 일했다! 감사합니다!
redolent

15

다음 단계에 따라 문제가 해결되었습니다.

  1. 대상 설정에서 빌드 단계로 이동하십시오.
  2. “바이너리와 바이너리 연결”로 이동하십시오.
  3. 라이브러리가 두 번 존재하는지 확인하십시오.
  4. 다시 빌드하십시오.

13

다른 링커 플래그에서 -ObjC를 제거하거나 실수로 .h 대신 .m 파일을 가져 왔는지 확인하십시오.


1
왜 -ObjC 플래그가 작동하지 않는지 궁금해하는 모든 사람들이이 답변에주의를 기울이십시오. 내 생각에 완전히 틀렸다 -ObjC 플래그가 "슈퍼 스페셜"케이스에서 작동하지 않습니다. smth에 대한 프로젝트를 검색 한 후 .m".h 대신 .m 파일을 가져 와서 수정 한 후 작동했습니다. Talk is cheap, show me the code!건배!
bgplaya

9

Xcode 7.3에서 일부 레거시 프로젝트가 열린 상황은 다음과 같습니다.

duplicate symbol _SomeEnumState in:

두 개의 관련이없는 파일들의 목록이 뒤 따랐다.

ld: 8 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

나를 위해 그것을 해결 한 것은 열거 형 선언을 다음과 같이 바꾸는 것입니다.

enum SomeEnumState {
    SomeEnumStateActive = 0,
    SomeEnumStateUsed = 1,
    SomeEnumStateHidden = 2
} SomeEnumState;

이에:

typedef NS_ENUM(NSUInteger, SomeEnumState) {
    SomeEnumStateActive = 0,
    SomeEnumStateUsed = 1,
    SomeEnumStateHidden = 2
};

누군가 이것에 대한 설명을 가지고 있다면, 저를 계몽하십시오.


나는 형식 정의 NS_ENUM에 열거를 전환 할 때 같은 점은 중복 문자 오류 수정, 나를 위해 그것을 고정
Mark24x7

9

둘 이상의 클래스에서 @implementation에서 동일한 변수를 정의하면이 문제가 발생할 수 있습니다.


그런데 왜? 동일은 같은 이름을 가진 일반 C 기능이 나에게 무슨 일이 있었
VIB

9

제 경우에는 위치에 같은 이름의 파일이 두 개있었습니다

대상> 빌드 단계> 소스 컴파일 및 중복 파일을 삭제하십시오.


8
  • 대상으로 이동
  • 빌드 설정을 선택하십시오
  • "No Common Blocks"를 검색 하고 NO로 선택하십시오 .

그것은 나를 위해 일했다


7

Cocoapods를 설치 한 후이 문제가 발생했습니다. 이제 일부 포드를 업데이트 할 때마다 발생합니다. 내가 찾은 해결책 :

터미널로 이동 :

1) pod deintegrate
2) pod install

또한 빌드 설정에서 "항상 내장 된 신속한 라이브러리"항목을 확인하십시오. 기본 구성을 사용 중임을 나타내는 "흐리게"표시되어야합니다. 수동 YES로 설정되어 있으면 delete를 눌러 기본 구성으로 되돌립니다. 이 동작이 중지되었습니다.


이것은 나를 위해 일했습니다. 그러나 "항상 Swift 라이브러리 임베드"는 이미 NO로 설정되어 있습니다. YES로 전환 한 다음 delete 키를 누른 다음 위에 언급 된 포드 기능을 실행했습니다.
BVB09

5

Xcode8 권장 프로젝트 설정 중에 나를 위해 "No Common Blocks"를 YES로 업데이트하면이 문제가 발생합니다.


오래된 프로젝트에 적용될 때 Xcode8.2.1과 동일합니다.
onekiloparsec

이것은 XCode 11.3.1에서도 수정되었습니다
LowFieldTheory

5

오늘 같은 오류가 발생했습니다. 오류의 핵심 단어는 duplicate입니다. 나는 그것을 수정합니다 :

1. Remove the duplicate file at Build Phases-->Compile Sources
2. If you can not remove it at Build Phases, you need find the file at your project and remove the reference by DELETE :

참조 제거

3. Add the file to your project again
4. Add the file's .m to your Build Phases-->Compile Sources again
5. Build your project, the error will disappear

감사! 내 경우에는 두 개의 main.m을 컴파일했는데 하나는 이전 참조였습니다. 이것은 드래그 앤 드롭으로 인한 것입니다.

4

실수로 .m 파일을 가져 오지 않았는지 확인하십시오. 프로젝트 창에서 파생 된 데이터를 삭제 한 다음 빌드하고 다시 실행할 수 있습니다.


4

이 문제가있는 다른 사람에게는이 답변 중 어느 것도 내 해결책을 보지 못했습니다.

.pbxproj 병합 충돌이 발생하여 수동으로 해결되었지만 (빈약하지는 않지만) .pbxproj의 개별 클래스 파일에 대한 중복 참조가있었습니다. 프로젝트> 빌드 단계> 컴파일 소스에서 삭제하면 모든 것이 해결되었습니다.

이것이 누군가를 도울 수 있기를 바랍니다.


또한 병합 충돌이 있었고 pbxproj 파일에서 수동으로 해결해야했습니다. 로 끝났습니다 ld: X duplicate symbols for architecture x86_64. 오류 메시지에 언급 된 소스 파일을 제거하고 프로젝트에 다시 추가하여 수정했습니다.
kas-kad

4

Juice007과 마찬가지로 두 개의 다른 .m 파일에서 C 유형 변수를 선언하고 초기화했습니다 (가져 오지 않은 파일입니다)

BOOL myVar = NO;

그러나 .m에서도 변수를 선언하고 초기화하는이 방법은 @implementation에서도 전역 범위를 부여합니다. 옵션은 다음과 같습니다.

  1. 범위를 클래스로 제한하려면 정적으로 선언하십시오.

    static BOOL myVar = NO;
  2. 초기화를 제거하십시오 (두 클래스가 전역 var를 공유하게 함).

    BOOL myVar;
    -(void) init{
        myVar = NO;
    }
  3. 속성으로 선언하십시오.

    @property BOOL myVar;
  4. @interface에서 적절한 iVar로 선언하십시오.

    @interface myClass(){
        BOOL myVar;
    }
    @end

4

필자의 경우 main()프로젝트에서 두 가지 방법을 정의했으며 하나를 제거하면 문제가 해결되었습니다.


여기에도 같은 문제가있었습니다. 당신의 게시물이 나를 도왔습니다. 감사!
Baran Emre

3

최근에 오류의 원인을 찾는 두통이있었습니다. 다른 클래스에서 다음 코드 스 니펫을 사용했기 때문에 내 앱이 컴파일하고 싶지 않다는 것을 알았을 때 궁금했습니다.

dispatch_time_t getDispatchTimeByDate(NSDate *date)
{
    NSTimeInterval interval;
    double second, subsecond;
    struct timespec time;
    dispatch_time_t milestone;


    interval = [date timeIntervalSince1970];
    subsecond = modf(interval, &second);
    time.tv_sec = second;
    time.tv_nsec = subsecond * NSEC_PER_SEC;
    milestone = dispatch_walltime(&time, 0);

    return milestone;
}

누군가를 도울 수 있기를 바랍니다.


작은 도우미 기능, 실수로 복사, 쉽게 간과-감사합니다!
Steven A. Lowe

3

확실히 도움이 되길 바랍니다

x86_64 아키텍처에 대해 동일한 오류 3 중복 기호가 있습니다.

내 경우에는 같은 프로젝트의 다른 파일에서 코드를 복사했습니다. Bm에 Am 파일의 코드가 있고 complilation 후 언급 한대로 오류가 발생했습니다. 전역 변수의 이름을 변경하여 오류를 해결했습니다.

이 오류는 두 파일에서 전역 변수에 대해 동일한 선언 때문에 내 경우에 발생했습니다.


3

포드 리포지토리를 추가 할 때 동일한 오류가 발생했습니다.

pod 'SWRevealViewController'

gitHub에서 이미 추가 된 소스 코드 (SWRevealViewController) 따라서 소스 코드 또는 포드 리포지토리를 제거하면 오류가 수정됩니다.

사례 # 2 :

두 번째 로이 오류는 .h 파일 에서 상수를 선언 할 때 나타납니다 .

NSString * const SomeConstant  = @"SomeValue";
@interface AppDelegate : UIResponder <UIApplicationDelegate> {
...
...

사례 2는 밤을 저를 구했습니다. 감사!
Pankaj Yadav

3

위의 답변은 저에게 효과적이지 않았습니다. 여기에 내가 어떻게 극복했는지가 있습니다.

1) 파인더에서 전체 Pods 폴더와 Podfile.lock 파일을 삭제합니다. 2) xcode 프로젝트를 닫습니다. 3) 터미널에서 pod 설치를 실행합니다. 4) xcode 프로젝트를 열고 clean build 명령을 실행합니다.

그 후 나를 위해 일했습니다.


2

프로젝트 내에서 lob 프로젝트를 통합 할 때도 같은 문제가 발생합니다.

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

실제로 lob 프로젝트에는 AFNetworking 파일이 있으므로 lob 프로젝트에서 .m 파일을 제거합니다.

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

실제로 .m 파일이 내 프로젝트 POd / AFNetworking / .m 파일과 충돌합니다

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


2

Xcode 6.3.2에서. 아래와 같이 모든 가능성을 확인했습니다.

1 : 프로젝트에서 .m 파일을 가져 오지 않았습니다.

2 : 다른 링커 플래그-ObjC 에서 제거 되었습니다 .

3 : 모든 파생 데이터를 제거했습니다 .

여전히 나는 같은 오류가 발생합니다. file 에서 변수 선언을 제거 하여이 오류를 제거했습니다.pch . 내 경우에는 파일에 AppDelegate객체를 선언 했습니다 .pch. 마침내 나는 오류를 일으키는 이유를 발견했습니다. 그래서 나는 .pch 파일과 프로젝트 작업 매력에서 변수의 선언을 제거합니다.


2

이 오류를 발생시키는 또 다른 바보 같은 실수는 반복되는 파일입니다. 실수로 일부 파일을 두 번 복사했습니다. 먼저 타겟-> 빌드 단계-> 컴파일 소스로갔습니다. 나는 그 목록에있는 파일과 위치가 두 번 나타났습니다.


왜 누군가가 당신을 억압했는지 모르겠습니다. 이것이 내 문제를 해결했습니다.
Yawar

2

.m오늘도이 결함 .m이 있습니다. 파일 에 const 값을 정의했기 때문에이 const 값을 포함하는 다른 파일을 정의 했기 때문에 두 개의 동일한 const 값이 있음을 의미 하므로이 오류가 나타납니다. 그리고 내 솔루션은 staticconst 값 앞에 키워드 " "를 추가하는 것입니다.

static CGFloat const btnConunt = 9;

그런 다음이 오류를보고하지 않는 프로젝트를 빌드합니다.

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