2012-05-21 2 views
5

Je développe une bibliothèque statique qui prend des captures d'écran, et les prendre à partir d'applications OpenGL nécessite une manipulation spéciale. Lorsque l'application cliente se connecte à ma bibliothèque statique, elle doit ajouter des frameworks utilisés par ma bibliothèque, par exemple pour prendre des captures d'écran OpenGL, même si l'application cliente n'utilise pas OpenGL, elle doit se lier avec OpenGLES.framework qui est mauvais. J'essaye de vérifier dans la bibliothèque si le client a lié avec OpenGLES.framework et permettez dynamiquement de prendre des screenshots d'OpenGL.Fonction de liaison C faible

Le problème est que j'obtiens l'erreur de compilation lorsque je tente d'utiliser les fonctions C comme:

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

Comme vous pouvez le voir, je peux vérifier l'existence de la méthode, mais comment puis-je l'invoquons pour ne pas provoquer erreur de liens ? Quand je compile client avec ma bibliothèque, je reçois ceci:

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

Je suis en train d'utiliser

__attribute__ ((weak)) 

mais il ne fonctionne pas (ne change rien).

+3

Pourquoi la liaison avec OpenGLES.framework est-elle mauvaise? –

+0

Je ne veux pas forcer les applications clientes à se lier avec elles si elles ne l'utilisent pas. –

Répondre

1

Vous pouvez ouvrir l'application en cours d'exécution et vérifier si elle est liée à OpenGL. Tout d'abord, recompilez votre application avec -rdynamic (ou tout ce que GCC d'Apple comprend). Utilisez ensuite le code suivant pour trouver une fonction:

#import <dlfcn.h> 

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

Merci ! Fonctionne très bien :) –

0

Voici un lien vers un excellent jeu de code pour la capture d'écran sans utiliser les bibliothèques OpenGL. Même les vues OpenGL commencent avec un UIView, donc si vous faites des captures d'écran en mode plein écran, cela devrait fonctionner. http://www.icodeblog.com/2009/07/27/1188/

Aussi, s'il est des captures d'écran de parties d'une vue OpenGL que vous êtes après, alors je suggère que vous utilisez toujours le code mentionné ci-dessus, et simplement recadrer à ce que vous avez besoin/envie, sinon vous pourrait aller dans le sens d'obtenir une capture partielle des pixels dans la vue OpenGL. Si vous faites cela cependant, alors l'utilisateur de votre API utilise déjà OpenGL et donc très certainement lié au framework.

+0

Nous utilisons déjà cette méthode, mais ce n'est pas si simple. Les vues qui ont un contenu OpenGL incorporé ne sont pas correctement affichées (je veux dire qu'elles ne sont pas affichées). La documentation dit: "[...] Important L'implémentation Mac OS X v10.5 de cette méthode ne supporte pas tout le modèle de composition de Core Animation: les calques QCCompositionLayer, CAOpenGLLayer, et QTMovieLayer ne sont pas rendus. [...]" –

Questions connexes