2012-05-21 20 views
5

मैं स्थिर पुस्तकालय विकसित कर रहा हूं जो स्क्रीनशॉट लेता है, और उन्हें ओपनजीएल अनुप्रयोगों से ले जाने के लिए विशेष हैंडलिंग की आवश्यकता होती है।कमजोर लिंकिंग सी फ़ंक्शन

जब क्लाइंट एप्लिकेशन मेरी स्थिर लाइब्रेरी से लिंक करता है तो उसे अपनी लाइब्रेरी द्वारा उपयोग किए गए ढांचे को जोड़ना होगा, उदाहरण के लिए ओपनजीएल स्क्रीनशॉट लेने के लिए, भले ही क्लाइंट ऐप ओपनजीएल का उपयोग नहीं कर रहा हो, इसे ओपनगलएस.फ्रेमवर्क से लिंक करना होगा जो खराब है। मैं लाइब्रेरी में जांचने की कोशिश कर रहा हूं अगर क्लाइंट ने OpenGLES.framework से जुड़ा हुआ है और गतिशील रूप से ओपनजीएल से स्क्रीनशॉट लेने में सक्षम है।

समस्या है जब मैं की तरह सी कार्यों का उपयोग करने की कोशिश मैं संकलन त्रुटि मिलती है:

if(&glReadPixels != NULL) { 
    glReadPixels(0, 0, size.width, size.height, GL_RGBA, GL_UNSIGNED_BYTE, buffer); 
} 

आप देख सकते हैं, मैं विधि होने की जाँच कर सकते हैं, लेकिन मैं इसे कैसे आह्वान करते लिंकर त्रुटि का कारण नहीं करने के लिए ? जब मैं अपने पुस्तकालय के साथ ग्राहक संकलन मैं इस मिल:

Undefined symbols for architecture i386: 
"_glReadPixels", referenced from: 
    +[TakeScreenshotUtil takeOpenGLScreenshotWithContext:layerSize:] in libScr-iOS.a(TakeScreenshotUtil.o) 

मैं

__attribute__ ((weak)) 

उपयोग करने के लिए कोशिश कर रहा हूँ, लेकिन यह काम नहीं करता है (कुछ भी नहीं बदलता है)।

+3

OpenGLES.framework के विरुद्ध लिंक क्यों खराब है? –

+0

यदि मैं इसका उपयोग नहीं करता हूं तो मैं क्लाइंट ऐप्स को इसके साथ लिंक करने के लिए मजबूर नहीं करना चाहता हूं। –

उत्तर

1

आप ऐप को निष्पादित कर सकते हैं और जांच सकते हैं कि यह ओपनजीएल से लिंक है या नहीं। सबसे पहले, अपने ऐप को - गतिशील (या जो भी समतुल्य ऐप्पल के जीसीसी समझता है) के साथ दोबारा दोहराएं। फिर फ़ंक्शन ढूंढने के लिए निम्न कोड का उपयोग करें:

#import <dlfcn.h> 

void (*_glReadPixels)(int, int, float, float, int, int, void *); 
_glReadPixels = dlsym(NULL, "glReadPixels"); 
if (_glReadPixels != NULL) { 
    /* take screenshot */ 
} 
+0

धन्यवाद ! बहुत अच्छा काम करता है :) –

0

ओपनजीएल पुस्तकालयों का उपयोग किए बिना स्क्रीनशॉटिंग के लिए कोड के एक महान सेट का लिंक यहां दिया गया है। ओपनजीएल विचार भी एक यूआईवीव के साथ शुरू होते हैं, इस प्रकार यदि आप पूर्ण स्क्रीन स्क्रीनशॉट कर रहे हैं तो यह अभी भी काम करना चाहिए। http://www.icodeblog.com/2009/07/27/1188/

इसके अलावा, यदि यह एक ओपन का मानना ​​है कि आप के बाद कर रहे हैं के कुछ भागों के स्क्रीनशॉट है, तो मेरा सुझाव है कि आप अभी भी कोड ऊपर संदर्भित उपयोग करें, और बस इसे नीचे आपको क्या चाहिए/चाहते हैं, और आप फसल OpenGL व्यू के भीतर पिक्सल का आंशिक कैप्चर करने के मार्ग को नीचे जा सकता है। यदि आप ऐसा कर रहे हैं, तो आपके एपीआई का उपयोगकर्ता पहले ही ओपनजीएल का उपयोग कर रहा है और इस प्रकार फ्रेमवर्क को वैसे भी जोड़ने की संभावना है।

+0

हम पहले से ही इस विधि का उपयोग करते हैं, लेकिन यह इतना आसान नहीं है। ओपनजीएल सामग्री को एम्बेड करने वाले दृश्य इसका उपयोग करके सही ढंग से प्रस्तुत नहीं करते हैं (मेरा मतलब है कि वे बिल्कुल प्रस्तुत नहीं करते हैं)। दस्तावेज़ीकरण कहता है: "[...] महत्वपूर्ण इस विधि का मैक ओएस एक्स v10.5 कार्यान्वयन पूरे कोर एनीमेशन संरचना मॉडल का समर्थन नहीं करता है। QCCompositionLayer, CAOpenGLLayer, और QTMovieLayer परतों को प्रस्तुत नहीं किया जाता है। [...]" –

संबंधित मुद्दे