2012-05-21 15 views
5

Tworzę bibliotekę statyczną, która wykonuje zrzuty ekranu, a pobieranie ich z aplikacji OpenGL wymaga specjalnej obsługi.Słabe połączenie funkcji C

Gdy aplikacja kliencka łączy się z moją biblioteką statyczną, musi dodać ramy używane przez moją bibliotekę, na przykład do wykonywania zrzutów ekranu OpenGL, nawet jeśli aplikacja kliencka nie korzysta z OpenGL, musi łączyć się z OpenGLES.framework, która jest zła. Próbuję sprawdzić w bibliotece, czy klient połączył się z OpenGLES.framework i dynamicznie włącza wykonywanie zrzutów ekranu z OpenGL.

Problem polega na tym dostaję błąd kompilacji, gdy próbuję użyć funkcji C jak:

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

Jak widać, można sprawdzić metodą istnienia, ale w jaki sposób powołać go do nie spowodować błąd linkera ? Kiedy skompilować klienta z mojej biblioteki uzyskać to:

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

Próbuję użyć

__attribute__ ((weak)) 

ale to nie działa (niczego nie zmienia).

+3

Dlaczego łączenie z OpenGLES.framework jest złe? –

+0

Nie chcę wymuszać na aplikacjach klienckich łączenia się z nim, jeśli go nie używają. –

Odpowiedz

1

Możesz otworzyć uruchomioną aplikację i sprawdzić, czy łączy się ona z OpenGL. Najpierw przekompiluj swoją aplikację za pomocą -rdynamic (lub jakiegokolwiek innego odpowiednika GCC firmy Apple). Następnie użyj następującego kodu, aby znaleźć funkcję:

#import <dlfcn.h> 

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

Dzięki ! Działa świetnie :) –

0

Oto link do świetnego zestawu kodu do zrzutu ekranu bez korzystania z bibliotek OpenGL. Nawet widoki OpenGL zaczynają się od UIView, więc jeśli robisz zrzuty ekranu Full Screen, to powinno działać. http://www.icodeblog.com/2009/07/27/1188/

również, jeżeli jest to screeny z fragmentów widoku OpenGL, że jesteś po, to sugerowałoby, że nadal korzystać z kodu mowa powyżej, i po prostu przyciąć go do czego potrzebujesz/chcesz, inaczej cię może przejść do częściowego przechwytywania pikseli w widoku OpenGL. Jeśli jednak robisz to, to użytkownik twojego API korzysta już z OpenGL, a więc i najprawdopodobniej z linkami do frameworka.

+0

Używamy już tej metody, ale to nie jest takie proste. Widoki, w których osadzona jest zawartość OpenGL, nie są renderowane poprawnie z jej użyciem (mam na myśli, że nie renderują się wcale). Dokumentacja mówi: "[...] Ważne Implementacja tej metody w systemie Mac OS X 10.5 nie obsługuje całego modelu kompozycji Core Animation, a warstwy QCCompositionLayer, CAOpenGLLayer i QTMovieLayer nie są renderowane. [...]" –