2012-05-21 24 views
5

Ich entwickle statische Bibliothek, die Screenshots macht, und sie aus OpenGL-Anwendungen erfordern spezielle Handhabung.Schwache Verknüpfung C-Funktion

Wenn eine Client-Anwendung eine Verbindung zu meiner statischen Bibliothek herstellt, müssen sie Frameworks hinzufügen, die von meiner Bibliothek verwendet werden, z. B. um OpenGL-Screenshots aufzunehmen. Selbst wenn die Client-Anwendung OpenGL nicht verwendet, muss sie mit OpenGLES.framework verlinken. Ich versuche, die Bibliothek einzuchecken, wenn der Client mit OpenGLES.framework verknüpft ist und die Erstellung von Screenshots aus OpenGL dynamisch ermöglicht.

Das Problem ist, ich Kompilierungsfehler, wenn ich versuche, wie C-Funktionen zu nutzen:

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

Wie Sie sehen können, habe ich für die Methode Existenz überprüfen kann, aber wie rufe ich es nicht Linker-Fehler verursachen ? Als ich Client mit meiner Bibliothek kompilieren bekomme ich dies:

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

I

__attribute__ ((weak)) 

zu verwenden ist versucht, aber es funktioniert nicht (nichts ändern).

+3

Warum ist das Binden gegen OpenGLES.framework schlecht? –

+0

Ich möchte Client-Anwendungen nicht zwingen, eine Verbindung herzustellen, wenn sie sie nicht verwenden. –

Antwort

1

Sie können die gerade ausgeführte App öffnen und prüfen, ob sie mit OpenGL verknüpft ist. Zuerst kompilieren Sie Ihre App mit -rdynamic (oder was auch immer äquivalent Apples GCC versteht). Verwenden Sie dann den folgenden Code, um eine Funktion zu finden:

#import <dlfcn.h> 

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

Vielen Dank ! Funktioniert super :) –

0

Hier ist ein Link zu einer großen Reihe von Code für den Screenshot ohne die OpenGL-Bibliotheken zu verwenden. Selbst OpenGL-Ansichten beginnen mit einer UIView. Wenn Sie also Vollbild-Screenshots machen, sollte dies immer noch funktionieren. http://www.icodeblog.com/2009/07/27/1188/

Auch, wenn es Screenshots von Teilen einer OpenGL Ansicht ist, dass Sie nach, dann würde ich vorschlagen, dass Sie noch den Code oben genannten verwenden, und es einfach zuzuschneiden auf, was Sie brauchen/wollen, was Sie könnte den Pfad der partiellen Erfassung der Pixel innerhalb der OpenGL-Ansicht gehen. Wenn Sie dies jedoch tun, verwendet der Benutzer Ihrer API bereits OpenGL und daher höchstwahrscheinlich eine Verknüpfung mit dem Framework.

+0

Wir verwenden diese Methode bereits, aber es ist nicht so einfach. Ansichten, die eingebetteten OpenGL-Inhalt enthalten, werden nicht korrekt gerendert (ich meine, sie werden überhaupt nicht gerendert). Die Dokumentation sagt: "[...] Wichtig Die Mac OS X 10.5-Implementierung dieser Methode unterstützt nicht das gesamte Kernanimationsmodell. Die Layer QCCompositionLayer, CAOpenGLLayer und QTMovieLayer werden nicht gerendert. [...]" –