-ObjC nicht auf alles anwenden

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • -ObjC nicht auf alles anwenden

    Hallo zusammen,

    ich habe ein SDK, welches ohne den Linker Flag -ObjC auskommt. Zusätzlich wird auch noch eine Library aus dem SDK direkt eingebunden. Dann gibt es da noch die SDKs von Dropbox, OneDrive, GoogleDrive und Box. Alle benötigen das Linker Flag -ObjC.

    Wie kann ich jetzt Xcode dazu überreden das Flag -ObjC nur für die Clouddrive SDKs anzuwenden ?
  • Das Flag -ObjC betrifft nur statische Bibliotheken, und weist den Linker an, alle Objective-C-Symbole zu laden, auch wenn sie nicht direkt referenziert werden. Aufgrund des dynamischen Aufbaus von Objective-C kommt man bei statischen Bibliotheken meines Erachtens gar nicht ohne das Flag aus. Dynamische Bibliotheken lädt das Programm zur Laufzeit. Hier ergibt das Flag keinen Sinn, da das Programm sowieso Zugriff auf alle Symbole hat.

    Wenn dein SDK ohne dieses Flag auskommt, basiert es entweder auf einer dynamischen Lib bzw. einem dynamischen Framework oder einer Bibliothek, die nur aus Headern besteht. Ein An- und Abschalten dieses Flags hat bei solchen Libs keine Auswirkungen.
    „Meine Komplikation hatte eine Komplikation.“
  • Hallo,

    danke erstmal für Deine Antwort. Leider hat es Auswirkungen auf das andere SDK, wenn ich das Flag -ObjC setze. Dann werden duplicate symbols for arm64 in mehreren Headerdateien vom SDK angezeigt.

    Deshalb meine Frage. Aber könnte ich das Problem eventuell umgehen, wenn ich die SDKs von den Cloudanbietern in ein Framework auslagere ?
  • MODWORLD schrieb:

    Die SDKs installiere ich über Pod Update. Meine Idee ist ein eigenes Framework Projekt anlegen und dort die Podinstallation durchführen und aus dem Hauptprojekt entfernen. Jedes SDK hat eine eigene Lib.
    Das löst aber wahrscheinlich nicht dein Problem. Ich würde erstmal schauen, wie die doppelten Symbole zustande kommen.
    „Meine Komplikation hatte eine Komplikation.“
  • Nein, da ich in einem anderen Branch das gleiche Projekt nur ohne Cocoa Pod Installation habe und dort nur lediglich das Flag -ObjC gesetzt habe und ich trotzdem die duplicate Symbol Meldungen bekomme.

    macmoonshine schrieb:

    MODWORLD schrieb:

    Die SDKs installiere ich über Pod Update. Meine Idee ist ein eigenes Framework Projekt anlegen und dort die Podinstallation durchführen und aus dem Hauptprojekt entfernen. Jedes SDK hat eine eigene Lib.
    Das löst aber wahrscheinlich nicht dein Problem. Ich würde erstmal schauen, wie die doppelten Symbole zustande kommen.
    Wieso würde das Framework wahrscheinlich nicht mein Problem lösen ? Das wüsste ich auch gerne. Es werden die folgenden Meldungen angezeigt :


    _OBJC_CLASS_$_MTExchangeDataThermoFrameFactory
    _OBJC_METACLASS_$_MTExchangeDataThermoFrameFactory
    _OBJC_IVAR_$_MTExchangeDataThermoInputMessage._warningHumidity
    Diese drei Typen auf mehrere Dateien verteilt. Die Datei MTExchangeDataThermoInputMessage.m hat zum Beispiel nur diese beiden Funktionen :

    C-Quellcode

    1. - (int)commandId
    2. {
    3. return 94;
    4. }
    5. - (NSString*)description
    6. {
    7. return [NSString stringWithFormat:@"MTExchangeDataThermoInputMessage\n"
    8. " Mode: %i\n"
    9. " Packet Number: %i\n"
    10. " Component1: %f\n"
    11. " Component2: %f\n"
    12. " Component3: %f\n"
    13. " Unique ID: %i\n"
    14. " Measurement ID: %i\n"
    15. " Temperature Mode: %i\n"
    16. " Alarm: %i\n"
    17. " Warning Amb Temperature: %i\n"
    18. " Warning Humidity: %i\n"
    19. " Warning Dew Point: %i\n",
    20. self.mode,
    21. self.packetNumber,
    22. self.component1,
    23. self.component2,
    24. self.component3,
    25. self.uniqueID,
    26. self.measID,
    27. self.temperatureMode,
    28. self.alarm,
    29. self.warningAmbTemp,
    30. self.warningHumidity,
    31. self.warningDewPoint];
    32. }
    Alles anzeigen
    Die MTExchangeDataThermoInputMessage.h hat lediglich nur folgendes drinstehen :


    C-Quellcode

    1. @interface MTExchangeDataThermoInputMessage : MTMessage
    2. // measurement settings - Device Mode
    3. @property(nonatomic, assign) int mode;
    4. @property(nonatomic, assign) int packetNumber;
    5. // measurement data
    6. @property(nonatomic, assign) float component1;
    7. @property(nonatomic, assign) float component2;
    8. @property(nonatomic, assign) float component3;
    9. @property(nonatomic, assign) int timestamp;
    10. // additional
    11. @property(nonatomic, assign) int laserOn;
    12. @property(nonatomic, assign) int uniqueID;
    13. @property(nonatomic, assign) int measID;
    14. @property(nonatomic, assign) int autoSync;
    15. @property(nonatomic, assign) int temperatureMode;
    16. @property(nonatomic, assign) int alarm;
    17. @property(nonatomic, assign) int warningAmbTemp;
    18. @property(nonatomic, assign) int warningHumidity;
    19. @property(nonatomic, assign) int warningDewPoint;
    Alles anzeigen
    Hilft das vielleicht weiter ?
  • Ich habe gerade mal die Symbole component1 bis component3 auskommentiert und sie wurden nicht mehr in der Fehlermeldung angezeigt. Das heißt also, dass Variablen mit gleichen Namen in einem anderen Header File vorkommen dürfen. Wie würdet Ihr jetzt bei einem fremden SDK vorgehen ? Umbenennen oder den Autor kontaktieren ?
  • Danke für Deine Antwort. Ich habe jetzt die Meldungen "_OBJC_IVAR_$_MTExchangeDataThermoInputMessage.xxx" schon weg bekommen. Die doppelten Variablen waren waren nicht so häufig vertreten. Jetzt bereiten mit nur noch diese beiden Meldungen Kopfschmerzen :

    _OBJC_CLASS_$_MTExchangeDataThermoFrameFactory
    _OBJC_METACLASS_$_MTExchangeDataThermoFrameFactory

    Da habe ich noch nicht rausgefunden, was diese zu bedeuten haben.
  • Ich nehme mal an, dass Du das hier meinst oder :
    duplicate symbol _OBJC_CLASS_$_MTExchangeDataThermoFrameFactory in:
    /Users/RWarnecke/Library/Developer/Xcode/DerivedData/LaserMessung-bzbnosqhjnwfbhcfphqccjoqdofq/Build/Intermediates/LaserMessung.build/Debug-iphoneos/LaserMessung.build/Objects-normal/arm64/MTExchangeDataThermoFrameFactory.o
    /Users/RWarnecke/repos/XCode/LaserMessung/LaserMessung/MT_Framework/networking/Protocol/libMTProtocol.a(MTExchangeDataThermoFrameFactory.o)
    duplicate symbol _OBJC_METACLASS_$_MTExchangeDataThermoFrameFactory in:
    /Users/RWarnecke/Library/Developer/Xcode/DerivedData/LaserMessung-bzbnosqhjnwfbhcfphqccjoqdofq/Build/Intermediates/LaserMessung.build/Debug-iphoneos/LaserMessung.build/Objects-normal/arm64/MTExchangeDataThermoFrameFactory.o
    /Users/RWarnecke/repos/XCode/LaserMessung/LaserMessung/MT_Framework/networking/Protocol/libMTProtocol.a(MTExchangeDataThermoFrameFactory.o)
    duplicate symbol _OBJC_CLASS_$_MTExchangeDataThermoInputMessage in:
    /Users/RWarnecke/Library/Developer/Xcode/DerivedData/LaserMessung-bzbnosqhjnwfbhcfphqccjoqdofq/Build/Intermediates/LaserMessung.build/Debug-iphoneos/LaserMessung.build/Objects-normal/arm64/MTExchangeDataThermoInputMessage.o
    /Users/RWarnecke/repos/XCode/LaserMessung/LaserMessung/MT_Framework/networking/Protocol/libMTProtocol.a(MTExchangeDataThermoInputMessage.o)
    duplicate symbol _OBJC_METACLASS_$_MTExchangeDataThermoInputMessage in:
    /Users/RWarnecke/Library/Developer/Xcode/DerivedData/LaserMessung-bzbnosqhjnwfbhcfphqccjoqdofq/Build/Intermediates/LaserMessung.build/Debug-iphoneos/LaserMessung.build/Objects-normal/arm64/MTExchangeDataThermoInputMessage.o
    /Users/RWarnecke/repos/XCode/LaserMessung/LaserMessung/MT_Framework/networking/Protocol/libMTProtocol.a(MTExchangeDataThermoInputMessage.o)
    duplicate symbol _OBJC_CLASS_$_MTExchangeDataThermoMessageFactory in:
    /Users/RWarnecke/Library/Developer/Xcode/DerivedData/LaserMessung-bzbnosqhjnwfbhcfphqccjoqdofq/Build/Intermediates/LaserMessung.build/Debug-iphoneos/LaserMessung.build/Objects-normal/arm64/MTExchangeDataThermoMessageFactory.o
    /Users/RWarnecke/repos/XCode/LaserMessung/LaserMessung/MT_Framework/networking/Protocol/libMTProtocol.a(MTExchangeDataThermoMessageFactory.o)
    duplicate symbol _OBJC_METACLASS_$_MTExchangeDataThermoMessageFactory in:
    /Users/RWarnecke/Library/Developer/Xcode/DerivedData/LaserMessung-bzbnosqhjnwfbhcfphqccjoqdofq/Build/Intermediates/LaserMessung.build/Debug-iphoneos/LaserMessung.build/Objects-normal/arm64/MTExchangeDataThermoMessageFactory.o
    /Users/RWarnecke/repos/XCode/LaserMessung/LaserMessung/MT_Framework/networking/Protocol/libMTProtocol.a(MTExchangeDataThermoMessageFactory.o)
    duplicate symbol _OBJC_CLASS_$_MTExchangeDataThermoOutputMessage in:
    /Users/RWarnecke/Library/Developer/Xcode/DerivedData/LaserMessung-bzbnosqhjnwfbhcfphqccjoqdofq/Build/Intermediates/LaserMessung.build/Debug-iphoneos/LaserMessung.build/Objects-normal/arm64/MTExchangeDataThermoOutputMessage.o
    /Users/RWarnecke/repos/XCode/LaserMessung/LaserMessung/MT_Framework/networking/Protocol/libMTProtocol.a(MTExchangeDataThermoOutputMessage.o)
    duplicate symbol _OBJC_METACLASS_$_MTExchangeDataThermoOutputMessage in:
    /Users/RWarnecke/Library/Developer/Xcode/DerivedData/LaserMessung-bzbnosqhjnwfbhcfphqccjoqdofq/Build/Intermediates/LaserMessung.build/Debug-iphoneos/LaserMessung.build/Objects-normal/arm64/MTExchangeDataThermoOutputMessage.o
    /Users/RWarnecke/repos/XCode/LaserMessung/LaserMessung/MT_Framework/networking/Protocol/libMTProtocol.a(MTExchangeDataThermoOutputMessage.o)
    ld: 8 duplicate symbols for architecture arm64

    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    Für die libMTProtocol.a habe ich keinen Quelltext. Kann diese Bibliothek also nicht neu erstellen.