2016-02-11 1 views
5

Mit dem neuesten offenen cv-Framework kann ich nicht auf IOS-Gerät Code kompilieren. Ich bin mit folgendem Fehler konfrontiert.Fehler beim Kompilieren von iOS-App mit openCV-Framework auf echtem Gerät

Undefined symbols for architecture arm64: "_png_init_filter_functions_neon", referenced from: _png_read_filter_row in opencv2(pngrutil.o) ld: symbol(s) not found for architecture arm64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

Die gleiche App kann für Simulator aber nicht für iOS-Geräte kompilieren. Kann mir jemand sagen, warum ich mit diesem Problem konfrontiert bin? Danke im Voraus.

+0

Sie müssen wissen, dass der Simulator der Simulator ist, und das reale Gerät ist anders. Ihr Fehlerprotokoll besagt eindeutig, dass die Bibliothek, die Sie verwenden, nicht für die 64-Bit-Geräte kompiliert ist. –

+0

Ich weiß nicht, wo von Ihnen 'opencv', aber 64 Bit wird standardmäßig auf dem neuesten' opencv' Framework unterstützt, erhalten Sie von - http://opencv.org/downloads.html –

+4

@FahriAzimov danke für die Antworten. Ich kenne Unterschiede und Fehler. Ja ich lade von der gleichen Stelle herunter. 3.0 funktioniert gut, aber 3.1 haben dieses Problem. – shahzaib

Antwort

2

Ich hatte dieses Problem behoben.Der Kern dieses Problems besteht darin, dass wir einige Inhalte in libpng neu kompilieren, vielleicht es in anderen ios-Framework.Then es macht einen Konflikt.Opncv 3.1 hat 3rdparty in seinem Code.Was Sie tun sollten Finden Sie die Linien 117-121 in libpng's pngpriv.h. Dann folgen Sie einfach Iphone - device - linker error.

2

Es scheint, dass dies behebt das Problem zu begehen, während immer noch NEON-Unterstützung für iOS-Geräte zu halten:

https://github.com/opencv/opencv/commit/262a52f3063c50fbb1236e2cba2bd3c68f9979bb

Wesentlichen die Klausel, die -DENABLE_NEON=ON auf die cmake Linie anfügt wurde nur auf Architekturen Anwendung mit "armv" Anfang (beachte das "v"); Das obige Commit ändert opencv/platforms/ios/build_framework.py, damit der cmake-Befehl auch mit "arm64" arbeiten kann.

Vorher:

if arch.startswith("armv"): 
     cmakecmd.append("-DENABLE_NEON=ON") 

Nach:

if arch.startswith("armv") or arch.startswith("arm64"): 
     cmakecmd.append("-DENABLE_NEON=ON") 

Diagnoseprozess, da es könnte nützlich sein:

diese Gefunden eine script build.log beginnend vor python ../opencv/platforms/ios/build_framework.py ios Aufrufen und Graben durch Ausgabe; arm_init.c wurde nicht für arm64 gebaut (wo png_init_filter_functions_neon definiert wurde) aber war für armv7 und armv7s. Von dort aus, durch 3rdparty/libpng/CMakeLists.txt Blick gerichtet auf ENABLE_NEON nicht festgelegt.

+1

Kirschen pflücken dieses Commit in 3.1 Zweig lösen das Problem? –

1

Ich konfrontiert das gleiche Problem wie @Shahzaib beschrieben. Im Simulator funktioniert es aber im iPhone funktioniert es nicht und zeigt den gleichen Fehler.

Zuvor habe ich OpenCV 3.1 in meinem iOS-Projekt manuell hinzugefügt. Später änderte ich es und installiere die OpenCV-Bibliothek über Cocoapod https://cocoapods.org/pods/OpenCV

Und in Cocoapod gibt es 3.1.0.1 Version, die das Problem behoben.

pod 'OpenCV', '~> 3.1.0.1'