mit curl auf iOS, kann ich nicht mit mehreren Architekturen verknüpfen, CurlchkszEQ Makro fehlgeschlagen

9

Ich habe zahlreiche Versionen von curl mit dem wunderbaren "build_curl" -Skript gebaut, das ich auf GitHub gefunden habe. Ich habe auch Curl mit anderen Techniken wieder aufgebaut.

Aber ich habe immer das gleiche Problem.

Ich habe ein iOS-Projekt, das gegen Curls verlinkt. Ich kann auf dem Simulator bauen und debuggen (klar mit i386). Ich kann mit einem Gerät bauen und debuggen, solange ich nur die aktuelle Architektur baue und das Gerät beim Build eingesteckt wird.

Wenn ich jedoch versuche, Release OR zu erstellen, wenn ich Debug für "iOS Device" erstellen möchte, ohne dass ein Gerät angeschlossen ist, bekomme ich immer den folgenden Fehler:

%Vor%

Dies wird dadurch verursacht:

%Vor%

Diese #define existiert in curlbuild.h

%Vor%

Was richtig sein sollte, da ich für eine 32-Bit-Architektur baue, hat Xcode jedoch entschieden, dass sizeof(long) != 4 , und so erzeugt das Makro einen Fehler.

Ich habe gewählt, nur für armv7 und armv7s zu bauen, und immer noch bekomme ich diesen Fehler.

Ich verstehe nicht, warum das nicht funktioniert.

    
Howard Shere 10.02.2014, 16:01
quelle

2 Antworten

7
  

Ich habe gewählt, nur für armv7 und armv7s zu bauen, und immer noch bekomme ich diesen Fehler.

Haben Sie sich die Build-Logs von Xcode angesehen, um zu bestätigen, dass nur -arch armv7 und -arch armv7s für die Kompilierung verwendet werden?

Ihr Problem hängt sicherlich mit der Tatsache zusammen, dass Sie eine einzelne Menge von Headern verwenden (z. B. für einen 32-Bit-Build der Bibliothek generiert), obwohl Sie versuchen, eine fette ausführbare Datei zu erstellen, die armv7 / v7s und arm64-Architekturen kombiniert.

Ich denke, Sie sollten sich auf Nick Zitzmann libcurl beziehen. Wie Sie sehen können, enthält der mitgelieferte Header curlbuild.h Ad-hoc-Makros, um zwischen ILP32 und LP64 zu unterscheiden:

%Vor%

Beachten Sie, dass die Anweisungen auf der Nick-Seite keine Genauigkeit darüber enthalten, wie diese Kopfzeile generiert wurde - ich würde sagen, dass sie speziell für plattformübergreifende Kompatibilität geändert wurde.

AKTUALISIEREN

Der obige Link ist nicht verfügbar (ein Snapshot finden Sie auf der Internet Archive - das letzte vordefinierte Produkt wurde für libcurl 7.40.0 vom 08.01.2015 erstellt. Ich habe eine Kopie (Verbatim) von build-libcurl-ios.sh und curlbuild.h (die einfache, praktische Kopfzeile für die iOScURL -Anwendung) hier erstellt .

Nach dem armv7 -Build erstellt das build-libcurl-ios.sh eine Kopie des generierten 32-Bit-Headers:

%Vor%

Gleiches nach dem arm64 Build:

%Vor%

Das letzte curlbuild.h ist nicht mehr als eine praktische Version, die dank der Abschnitte #ifdef __LP64__ /* ... */ #else /* ... */ #endif sowohl 32-Bit- als auch 64-Bit-Spezifizierungen enthält. Insbesondere gibt es mehr als nur CURL_SIZEOF_LONG Unterschiede, z.B.:

%Vor%     
deltheil 11.02.2014, 10:32
quelle
0

Ich wollte nicht jeden der Unterschiede zwischen den 32-Bit- und 64-Bit-Headern durchgehen, sondern tat dies stattdessen:

  1. 32- und 64-Bit-Builds von libcurl inklusive Header erstellt, mit dem hier gefundenen Skript: Ссылка
  2. Fügen Sie die Header in die Verzeichnisse include-32 und include-64 ein.
  3. Setzen Sie Header-Suchpfade so, dass sie ein Verzeichnis oberhalb der in Schritt 2 erstellten Verzeichnisse enthalten.
  4. Erstellt eine Header-Datei namens my_curl.h like so:

    %Vor%

Vielleicht nicht die eleganteste Lösung, aber es hat mir die Zeit (und die Gefahr von Fehlern) erspart, es von Hand zu tun.

    
arrtchiu 18.05.2017 15:37
quelle

Tags und Links