Cross-compile libgcrypt para o iPhone? Erro de linker… parece não encontrar “fwrite” e “strerror”?
Eu tenho sucessocross-compilou o Apache Portable Runtime (APR) para o iPhone, usando um conjunto deconfigurar scripts que invocam o GNU Autotools "./configure" com as opções de compilação cruzada necessárias.
Eu estou agora tentando cross-compilar o GNUTLS que depende do libtasn1 e do libgcrypt, que por sua vez, depende do libgpg-error. É aqui que estou com problemas e posso usar sua ajuda ...
Atualmente estou tentando cross-compilar libgpg-error. Os scripts de configuração que eu usei antes estão funcionando lindamente; o processo "./configure" é concluído de forma limpa. Os problemas ocorrem quando eu corro "make". Quando eu executo make, tudo parece compilar, mas depois eu recebo o seguinte erro de linker desagradável no final:
/bin/sh ../libtool --tag=CC --mode=link /Users/michaelsafyan/Downloads/libgpg-error-1.7/compile /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 -std=c99 -arch armv6 -pipe -no-cpp-precomp --sysroot='/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk' -isystem /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib/gcc/arm-apple-darwin9/4.2.1/include/ -isystem /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/include -isystem /Developer/Platforms/iPhoneOS.platform/Developer/usr/include -isystem /opt/iphone-3.0/include -isystem /usr/local/iphone-3.0/include -arch armv6 --sysroot='/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk' -L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib -L/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib -L/opt/iphone-3.0/lib -L/usr/local/iphone-3.0/lib -o gpg-error gpg_error-strsource-sym.o gpg_error-strerror-sym.o gpg_error-gpg-error.o ./libgpg-error.la /Users/michaelsafyan/Downloads/libgpg-error-1.7/compile /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 -std=c99 -arch armv6 -pipe -no-cpp-precomp --sysroot=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk -isystem /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib/gcc/arm-apple-darwin9/4.2.1/include/ -isystem /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/include -isystem /Developer/Platforms/iPhoneOS.platform/Developer/usr/include -isystem /opt/iphone-3.0/include -isystem /usr/local/iphone-3.0/include -arch armv6 --sysroot=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk -o gpg-error gpg_error-strsource-sym.o gpg_error-strerror-sym.o gpg_error-gpg-error.o -L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib -L/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib -L/opt/iphone-3.0/lib -L/usr/local/iphone-3.0/lib ./.libs/libgpg-error.a Undefined symbols: "_fwrite$UNIX2003", referenced from: _main in gpg_error-gpg-error.o "_strerror$UNIX2003", referenced from: _gpg_strerror in libgpg-error.a(libgpg_error_la-strerror.o) ld: symbol(s) not found collect2: ld returned 1 exit status make[3]: *** [gpg-error] Error 1 make[2]: *** [all] Error 2 make[1]: *** [all-recursive] Error 1 make: *** [all] Error 2
Alguma idéia de como fazer isso funcionar? As versões do software que estou compilando são:
libgpg-error: 1.7libgcrypt: 1.4.4libtasn1: 2.2gnutls: 2.8.4Por favor ajude. Obrigado.
AtualizarDe acordo com o feedback inicial, cada SDK tem uma cópia de "libSystem.dylib" em "$ SDKROOT / usr / lib". Não há uma cópia do libSystem em "$ DEVROOT / usr / lib", onde:
$ DEVROOT = "/Developer/Platforms/iPhoneOS.platform/Developer"$ SDKROOT = "$ DEVROOT / SDKs / iPhoneOS $ VER.sdk"As bibliotecas "libSystem" contêm as versões comuns não-decoradas de cada símbolo, mas não contêm as variantes "$ UNIX2003" dos símbolos. Eu suspeito que GPG-ERROR está definindo "_POSIX_C_SOURCE", "_UNIX", ou outra macro de teste de recurso UNIX, e que um cabeçalho não autorizado que está anexando "$ UNIX2003" às funções quando essas macros de teste de recurso estão presentes está sendo incluído. Remover "$ DEVROOT / usr / include" da lista de diretórios de inclusão não tem efeito com relação à remoção dessa mensagem de erro.
Como último recurso, vejo que "ld" aceita uma opção "-alias_list" que permite especificar um arquivo com entradas como "_fwrite _fwrite $ UNIX2003" para forçar a resolução desses símbolos indefinidos para suas variantes não-decoradas. Se possível, gostaria de evitar essa opção, pois parece hackish e potencialmente perigoso.