2012-05-21 17 views
5

Sto sviluppando una libreria statica che acquisisce schermate e che le acquisisce dalle applicazioni OpenGL richiedono una gestione speciale.Debole collegamento C Funzione

Quando l'applicazione client si collega alla mia libreria statica deve aggiungere framework usati dalla mia libreria, per esempio per prendere screenshot di OpenGL, anche se l'app client non sta usando OpenGL deve collegarsi con OpenGLES.framework che è male. Sto cercando di verificare nella libreria se il client è collegato con OpenGLES.framework e abilitare dinamicamente la cattura di schermate da OpenGL.

Il problema è ottengo errore di compilazione quando si tenta di utilizzare le funzioni C come:

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

Come potete vedere, posso controllare per il metodo di esistenza, ma come faccio a invocarlo di non causare errore di linker ? Quando compilo cliente con la mia libreria ottengo questo:

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

Sto cercando di utilizzare

__attribute__ ((weak)) 

ma non funziona (non cambia nulla).

+3

Perché il collegamento a OpenGLES.framework è negativo? –

+0

Non voglio forzare le app client a collegarsi con essa se non la usano. –

risposta

1

È possibile aprire l'app in esecuzione e controllare se si collega a OpenGL. Per prima cosa, ricompila la tua app con -rdynamic (o qualsiasi altra cosa che l'equivalente del GCC di Apple capisca). Quindi utilizzare il seguente codice per trovare una funzione:

#import <dlfcn.h> 

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

Grazie ! Funziona alla grande :) –

0

Questo è un collegamento a un grande set di codice per lo screenshot senza utilizzare le librerie OpenGL. Anche le viste OpenGL iniziano con un UIView, quindi se si stanno facendo screenshot a schermo intero questo dovrebbe comunque funzionare. http://www.icodeblog.com/2009/07/27/1188/

Inoltre, se si tratta di screenshot di porzioni di una vista OpenGL che si sta dopo, allora vorrei suggerire che si utilizza ancora il codice di cui sopra, e semplicemente ritagliarla verso il basso per quello che ti serve/vuole, altrimenti si potrebbe seguire il percorso di acquisizione parziale dei pixel all'interno di OpenGL View. Se lo stai facendo, allora l'utente della tua API sta già usando OpenGL e quindi molto probabilmente collegherà comunque al framework.

+0

Utilizziamo già questo metodo, ma non è così semplice. Le viste che hanno contenuto OpenGL incorporato non lo rendono correttamente nel suo utilizzo (voglio dire che non lo rendono affatto). La documentazione dice: "[...] Importante L'implementazione di Mac OS X v10.5 di questo metodo non supporta l'intero modello di composizione Core Animation: i layer QCCompositionLayer, CAOpenGLLayer e QTMovieLayer non vengono renderizzati. [...]" –

Problemi correlati