0

Недавно я решил интегрировать GCM в мой проект, который уже использует буферы протокола Google. Все работало нормально, образец был в порядке. Но когда я пытался интегрировать GCM через CocoaPods в мой проект - я начал получать ошибки построения:Невозможно построить GCM с Protobuf в Xcode

Undefined symbols for architecture x86_64: 
"_GSDK_PBLogicalRightShift32", referenced from: 
    _SerializedSize in libGcmLib.a(GCMSecureSocket.o) 
"_OBJC_CLASS_$_GSDK_PBCodedOutputStream", referenced from: 
    objc-class-ref in libGcmLib.a(GCMSecureSocket.o) 
"_OBJC_CLASS_$_GSDK_PBDescriptor", referenced from: 
    objc-class-ref in libGcmLib.a(GtalkCore.pb.o) 
    objc-class-ref in libGcmLib.a(GtalkExtensions.pb.o) 
"_OBJC_CLASS_$_GSDK_PBGeneratedMessage", referenced from: 
    _OBJC_CLASS_$_GtalkHeartbeatPing in libGcmLib.a(GtalkCore.pb.o) 
    _OBJC_CLASS_$_GtalkHeartbeatAck in libGcmLib.a(GtalkCore.pb.o) 
    _OBJC_CLASS_$_GtalkErrorInfo in libGcmLib.a(GtalkCore.pb.o) 
    _OBJC_CLASS_$_GtalkSetting in libGcmLib.a(GtalkCore.pb.o) 
    _OBJC_CLASS_$_GtalkLoginRequest in libGcmLib.a(GtalkCore.pb.o) 
    _OBJC_CLASS_$_GtalkLoginResponse in libGcmLib.a(GtalkCore.pb.o) 
    _OBJC_CLASS_$_GtalkClose in libGcmLib.a(GtalkCore.pb.o) 
    ... 
"_OBJC_CLASS_$_GSDK_PBRootObject", referenced from: 
    _OBJC_CLASS_$_GtalkGtalkCoreRoot in libGcmLib.a(GtalkCore.pb.o) 
    _OBJC_CLASS_$_GtalkGtalkExtensionsRoot in libGcmLib.a(GtalkExtensions.pb.o) 
"_OBJC_METACLASS_$_GSDK_PBGeneratedMessage", referenced from: 
    _OBJC_METACLASS_$_GtalkHeartbeatPing in libGcmLib.a(GtalkCore.pb.o) 
    _OBJC_METACLASS_$_GtalkHeartbeatAck in libGcmLib.a(GtalkCore.pb.o) 
    _OBJC_METACLASS_$_GtalkErrorInfo in libGcmLib.a(GtalkCore.pb.o) 
    _OBJC_METACLASS_$_GtalkSetting in libGcmLib.a(GtalkCore.pb.o) 
    _OBJC_METACLASS_$_GtalkLoginRequest in libGcmLib.a(GtalkCore.pb.o) 
    _OBJC_METACLASS_$_GtalkLoginResponse in libGcmLib.a(GtalkCore.pb.o) 
    _OBJC_METACLASS_$_GtalkClose in libGcmLib.a(GtalkCore.pb.o) 
    ... 
"_OBJC_METACLASS_$_GSDK_PBRootObject", referenced from: 
    _OBJC_METACLASS_$_GtalkGtalkCoreRoot in libGcmLib.a(GtalkCore.pb.o) 
    _OBJC_METACLASS_$_GtalkGtalkExtensionsRoot in libGcmLib.a(GtalkExtensions.pb.o) 

ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

я предполагал, что это происходит потому, что библиотека GCM имеет ProtocolBuffers в нем, и он конфликтует с моими источниками Protobuf что у меня есть отсюда: https://github.com/google/protobuf/tree/master/objectivec

Я также попытался построить для устройства и в результате получить аналогичную ошибку - с armv7 вместо x86_64. Кроме того, я должен сказать, что образец проекта работает отлично, поэтому я думаю, что Protobuf является главной проблемой здесь. Тем не менее, я понятия не имею, как это можно решить. Есть предположения?

+0

Ну. После нескольких часов поиска я закончил использование старой версии (2.3.3) protobuf, у которой нет этих файлов PB. https://github.com/mingchen/protobuf-ios Добавил его в мой проект с GCM, и все сработало нормально. Но по какой-то причине protobuf 3 не работает, и мне грустно :( Если кому-то удалось создать protobuf3 + GCM - пожалуйста, дайте свой ответ. – quarezz

ответ

0

Проверьте, соответствуют ли архитектуры libGcmLib.a и вашей целевой архитектуре построения.

Вы можете проверить архитектуру .a файла с помощью команды

otool -hv libGcmLib.a

Apprarently следующие объекты построены не против x86_64 архитектуры.

GCMSecureSocket.o 
GtalkCore.pb.o 
... 

Как построить libGcmLib.a статическую LIB? Просмотрите его.

+0

Я запустил инструмент, результат для GCMSecureSocket.o: cputype : x86_64 cpusubtype: ALL Я не думаю, что здесь есть архитектура (хотя Xcode говорит, что это так), потому что тестовый проект только с этим модулем (GCM) отлично работает на всех архитектурах. Проблемы начинаются, когда я добавляю GCM к проектам с исходными файлами Protobuf - я думаю, что они конфликтуют, так как GCM внутри lib может иметь одинаковые файлы Protobuf. Также для него указаны имена классов: _GSDK_PBRootObject ", GSDK_PBGeneratedMessage – quarezz

Смежные вопросы