2016-02-11 8 views
5

नवीनतम खुले सीवी फ्रेमवर्क के साथ मैं आईओएस डिवाइस पर कोड संकलित करने में असमर्थ हूं। मुझे निम्नलिखित त्रुटि का सामना करना पड़ रहा है।वास्तविक डिवाइस पर ओपनसीवी फ्रेमवर्क के साथ आईओएस ऐप को संकलित करते समय त्रुटि

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)

वही ऐप सिम्युलेटर के लिए संकलित करने में सक्षम है लेकिन आईओएस उपकरणों के लिए नहीं। क्या कोई मुझे बता सकता है कि मुझे इस समस्या का सामना क्यों करना है। अग्रिम में धन्यवाद।

+0

आपको पता होना चाहिए कि सिम्युलेटर सिम्युलेटर है, और असली डिवाइस अलग है। आपका त्रुटि लॉग स्पष्ट रूप से कहता है कि आपके द्वारा उपयोग की जाने वाली लाइब्रेरी 64 बिट डिवाइसों के लिए संकलित नहीं है। –

+0

मुझे नहीं पता कि आपको कहां से 'ओपनसीवी' मिला है, लेकिन 64 बिट को नवीनतम 'ओपनसीवी' ढांचे पर डिफ़ॉल्ट रूप से समर्थित किया गया है, इसे प्राप्त करें - http://opencv.org/downloads.html –

+4

@FahriAzimov धन्यवाद जवाब दे दो। मैं मतभेद और त्रुटि के बारे में जानता हूँ। हाँ मैं एक ही जगह से डाउनलोड करता हूँ। 3.0 ठीक काम कर रहा है लेकिन 3.1 में यह समस्या है। – shahzaib

उत्तर

2

मैंने इस समस्या को ठीक कर दिया था। इस समस्या का मूल यह है कि हम libpng में कुछ सामग्री को पुन: संकलित करते हैं, शायद यह अन्य आईओएस ढांचे में निकलता है। फिर यह एक संघर्ष करता है। ओपीएनसीवी 3.1 में इसके कोड में तीसरी पार्टी है। आपको क्या करना चाहिए libpng के pngpriv.h में पंक्तियों को 117-121 मिलते हैं। फिर Iphone - device - linker error का पालन करें।

2

ऐसा लगता है कि यह ठीक करता है प्रतिबद्ध मुद्दा है, जबकि अभी भी iOS उपकरणों के लिए नियोन समर्थन रखने:

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

अनिवार्य रूप से, खंड है कि cmake लाइन के लिए -DENABLE_NEON=ON संलग्न कर देता है केवल आर्किटेक्चर के लिए आवेदन किया गया था "armv" के साथ शुरुआत ("वी" नोट करें); उपरोक्त प्रतिबद्धता opencv/platforms/ios/build_framework.py को cmake कमांड को "arm64" के साथ काम करने की अनुमति देने के लिए बदलती है।

से पहले:

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

के बाद:

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

नैदानिक ​​प्रक्रिया है, क्योंकि यह उपयोगी हो सकता है:

एक script build.log शुरू करने से इस मिले python ../opencv/platforms/ios/build_framework.py ios लागू और के माध्यम से खुदाई से पहले आउटपुट; arm_init.carm64 (जहां png_init_filter_functions_neon परिभाषित किया गया था) के लिए बनाया गया था, लेकिन armv7 और armv7s के लिए था। वहां से, 3rdparty/libpng/CMakeLists.txt पर देखकर ENABLE_NEON पर सेट किया गया है।

+1

क्या चेरी इस शाखा को 3.1 शाखा में उठाकर इस मुद्दे को हल करता है? –

1

मुझे उसी समस्या का सामना करना पड़ा जैसा @ शाहजीब ने वर्णित किया था। सिम्युलेटर में यह काम करता है लेकिन आईफोन में यह काम नहीं कर रहा है और एक ही त्रुटि दिखा रहा है।

पहले मैंने मैन्युअल रूप से अपने आईओएस प्रोजेक्ट में ओपनसीवी 3.1 जोड़ा। बाद में मैंने इसे बदल दिया और ओपनसीवी लाइब्रेरी को कोकोपॉड https://cocoapods.org/pods/OpenCV

और कोकोपॉड में 3.1.0.1 संस्करण है जो इस मुद्दे को हल करता है।

pod 'OpenCV', '~> 3.1.0.1' 
संबंधित मुद्दे