2013-09-30 24 views
6

Ho aggiunto libpng alla mia applicazione. Se costruisco per il simulatore, tutto è OK. Quando costruisco applicazione per il dispositivo, ho ottenuto l'errore del linker:Iphone - device - linker error

Undefined symbols for architecture armv7: "_png_init_filter_functions_neon", referenced from: _png_read_filter_row in libpng-arm7-release.a(pngrutil.o) 

ho costruire libpng manualmente dai sorgenti, allo stesso modo per il simulatore e il dispositivo (solo con mutato obiettivo di compilazione). Ho cercato di trovare questo problema, ma nessuno sembra pubblicare nulla su questo problema.

risposta

7

I "risolto" questo sostituendo linee 117-121 in libpng s' pngpriv.h:

# ifdef __ARM_NEON__ 
#  define PNG_ARM_NEON_OPT 2 
# else 
#  define PNG_ARM_NEON_OPT 0 
# endif 

da

#define PNG_ARM_NEON_OPT 0 

Ciò disattiva ottimizzazioni NEON ARM, che sembra essere la causa della problema.

Questo è solo un modo per risolvere il problema, non ho avuto il tempo di indagare ulteriormente sulla vera causa del problema.

+2

È necessario compilare i file * .c dalla cartella arm. – PSyton

+3

puoi anche compilare semplicemente con il flag del preprocessore "PNG_ARM_NEON_OPT = 0" in modo da non dover modificare il sorgente libpng – bitwise

+0

Dobbiamo compilare * .c dopo aver fatto il cambiamento in .h, e come? –

0

In aggiunta al commento di PSyton, ecco come l'abbiamo risolto. Compilare i file arm/*.c. Questo però funziona solo per Android. Per iOS, abbiamo inoltre dovuto creare una nuova pnglibconf.h con le voci:

#undef PNG_ARM_NEON_API_SUPPORTED 
#undef PNG_ARM_NEON_CHECK_SUPPORTED 
#define PNG_ARM_NEON_OPT 0 

Guardando l'ARM definisce in libpng, sembra che sono un po 'buggy attualmente, come PNG_ARM_NEON_API_SUPPORTED dovrebbe essere sufficiente a trasformare la compilazione NEON off .