2015-09-22 12 views
16

Kiedy próbowałem skompilować mojego projektu Xcode z OpenCV 2.4 iOS przy użyciu XCode 7 + iOS SDK 9, XCode narzekali, żeJak skompilować OpenCV iOS z ENABLE_BITCODE

ld: 'opencv2.framework/opencv2(alloc.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. for architecture arm64

clang: error: linker command failed with exit code 1 (use -v to see invocation)

i odmówił połączyć. Po pewnym uruchomieniu go w serwisie, to znaczy, że Apple dodał nową funkcję o nazwie Bitcode do optymalizacji aplikacji w sklepie App Store. Podczas gdy binarny system OpenCV iOS nie został zaktualizowany tak, aby zawierał kod Bitcode, nie może przejść etapu połączenia.

Pewne reference wskazało tymczasowe rozwiązanie, aby wyłączyć ENABLE_BITCODE, więc łączenie można zrobić bez Bitcode. Zapobiegnie to kompilacji aplikacji dla zegarków Apple, ponieważ Bitcode jest obowiązkowe w przypadku aplikacji do oglądania. Dlatego moje pytanie brzmi, czy są jakieś (najlepsze łatwe) sposoby kompilacji iOS OpenCV z włączonym Bitcodem? (lepiej z linkiem pobierania dla skompilowanego środowiska)

Odpowiedz

18

Po pewnym wyszukiwaniu i wersji próbnej, znalazłem sposób na skompilowanie OpenCV iOS ze źródła z Bitcode. Tutaj znajduje się również skompilowany plik binarny: [v3.0][v2.4]. [Zrzeczenie się: Nie jestem odpowiedzialny za integralność skompilowanego pliku binarnego. Używaj na własne ryzyko.]

Kroki kompilacji są w zasadzie takie same jak w przypadku official document, z tylko jednym dodatkowym krokiem.

  1. Pobierz kod z git:

    cd ~/<my_working_directory>

    git clone https://github.com/Itseez/opencv.git

  2. Dodać link symboliczny do Xcode pozwolić OpenCV budować skrypty znaleźć kompilatora, plików nagłówkowych itp

    cd /

    sudo ln -s /Applications/Xcode.app/Contents/Developer Developer

  3. [Key Krok] Zmień skrypt kompilacji dodać dodatkową opcję dla Bitcode: edytować ~/<my_working_directory>/opencv/platform/ios/build_framework.py i znajdź linię zawierającą -DCMAKE_C_FLAGS. Dodaj flagę -fembed-bitcode. Na przykład, w źródle dostałam, to linia 55, a będzie wyglądać

    "-DCMAKE_C_FLAGS=\"-Wno-implicit-function-declaration -fembed-bitcode\" " +

    po zmianie. [ref]

  4. budowy ramy OpenCV:

    cd ~/<my_working_directory>

    python opencv/platforms/ios/build_framework.py ios

    Jeśli wszystko jest w porządku, kilka minut później dostaniesz ~/<my_working_directory>/ios/opencv2.framework. Możesz dodać tę strukturę do swoich projektów Xcode.

P.S. Zadaj pytanie, nawet jeśli już wiesz, odpowiedź jest zachęcana zgodnie z this post na Meta Stackchange.

+2

Zauważyłem, że nowa wersja opencv (wersja 3.1) ma już flagę -fembed-bitcode w pliku build_framwork.py – CSawy

+0

@CSstudent Dzięki za heads up! – grapeot

+0

@grapeot Podążałem tymi samymi krokami, ale w obliczu problemów jak krok 4. Uprzejmie mi pomóż. Mogę pokazać ci logi, ale przekraczają limit znaków. Więc nie mogę pisać tutaj. –

7

OpenCV jest dokładnie takim rodzajem oprogramowania (wraz z kodekami audio i wideo), które prawdopodobnie będzie miało ręczną optymalizację ARM NEON. The documentation sugeruje, że ~ 40 funkcji miało to traktowanie w OpenCV3.0.

Jeśli kompilujesz dla kodu bitowego LLVM, otrzymasz zamiast tego wersję ogólną (mniej zoptymalizowaną, zaimplementowaną w C lub C++).

Używanie Bitcode jest opcjonalne - z wyjątkiem kompilacji dla zegarka Apple, gdzie trudno sobie wyobrazić, że i tak wykonałbyś skomplikowane obliczeniowo przetwarzanie obrazu. Jeśli łączysz aplikację do obejrzenia, zastąp ustawienie tylko dla bitu na kompilacji.