libgcrypt cross-compilação para o iPhone? erro de vinculador ... não consigo encontrar “fwrite” e “strerror”?

StackOverflow https://stackoverflow.com/questions/1620375

Pergunta

Eu tenho sucesso cross-compilado o Apache portátil Runtime (APR) para o iPhone , usando um conjunto de scripts de configuração que invocar o GNU Autotools" ./configure" com o opções necessárias cross-compilação.

Agora estou tentando cruzar-compilação GNUTLS que depende libtasn1 e sobre libgcrypt, que por sua vez, depende libgpg de erros. Aqui é onde eu estou correndo em problemas e poderia usar sua ajuda ...

Atualmente, estou tentando cruzar-compilação libgpg de erros. Os scripts de configuração que eu usei antes estão trabalhando muito bem; o processo "./configure" completa limpa. Os problemas ocorrem quando eu executar "make". Quando eu executar make, tudo parece para compilar, mas então eu recebo o seguinte erro vinculador 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

Algumas ideias sobre como obter este trabalho? As versões do software que estou compilando são:

  • libgpg-de erro: 1,7
  • libgcrypt: 1.4.4
  • libtasn1: 2.2
  • gnutls: 2.8.4

Por favor, ajuda. Obrigado.

Atualização

De acordo com o feedback inicial, cada SDK tem uma cópia do "libSystem.dylib" em "$ SDKROOT / usr / lib". Não há nenhuma 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, undecorated comuns, de cada símbolo, mas não contêm o "$ UNIX2003" variantes dos símbolos. Eu suspeito que GPG-ERROR está definindo "_POSIX_C_SOURCE", "_UNIX", ou outro teste recurso macro UNIX, e que um cabeçalho desonestos que está acrescentando "$ UNIX2003" às funções quando estas macros teste recurso estão presentes está sendo incluído. Removendo "$ DEVROOT / usr / include" na lista de incluir diretórios não tem efeito em relação a querer retirar esta 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" a força resolver esses símbolos indefinidos para as suas variantes sem decoração. Se possível, eu gostaria de evitar essa opção, uma vez que parece hackish e potencialmente perigoso.

Foi útil?

Solução

Normalmente, um não resolvidas meios símbolo $ UNIX2003 que você está ligando contra um SDK mais velha do que aquela que os arquivos de objetos existentes foram construídas contra .

Uma estranha olhando incluir caminho para mim, e nota por favor que eu sou apenas vagamente familiarizado com Mac developement e não em tudo com iPhone developement, é o caminho

/Developer/Platforms/iPhoneOS.platform/Developer/usr/include

que não é realmente na pasta SDK. É possível que você já pegou os símbolos desonestos, se eles são de que, a partir daí? Parece improvável, uma vez que ocorre mais tarde na linha de comando que o SDK incluem caminhos.

Talvez em vez os símbolos são as versões esperados de _fwrite e _strerror e assim gpg_error-gpg-error.o e libgpg-error.a estão bem e é realmente uma questão de ligar embora novamente improvável que você tenha

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib

como uma opção -L. Estou assumindo que há um dylib Libsystem em algum lugar?

Eu acho que a primeira coisa a fazer é verificar se a versão UNIX2003 do símbolo é o que você espera ou não. Meu palpite é que é, mas o que eu digo que eu poderia estar completamente errado. :)

Em segundo lugar, você poderia tentar obter detalhado saída do ld para ver onde ele está encontrando símbolos. Eu tenho certeza que é uma variável de ambiente pode ser configurado para fazer isso acontecer, mas eu não consigo ver nenhuma listada na página man on-line para ld. ( Atualizar :? As duas variáveis ??env são LD_TRACE_ARCHIVES e LD_TRACE_DYLIBS mas talvez eles dão o mesmo que -t).

Editar:

OK, então eu estava completamente errado sobre os UNIX2003 símbolos sendo os que foram necessários. lol.

Quando você construiu libgpg de erros eu acho que vai ter criado um arquivo

src / .deps / gpg_error-gpg-error.Po

que contém dependências de cabeçalho (pelo menos ele fez no meu sistema Linux). Isso pode dar uma pista a respeito de onde ele pegou o cabeçalho errado quando construindo gpg_error-gpg-error.o.

BTW, parece como se o script configure libgpg de erros aceita tanto um -isysroot e -archoptions. você não pode usar aqueles em vez de sua própria versão do script de configuração?

Edit2:

Ok, vamos ter outra chance :) Aqui estão algumas coisas para tentar, a partir de uma pasta de origem limpo:

  • uso -isysroot vez de --sysroot
  • uso -isysroot, bem como --sysroot
  • temporariamente fazer seus cabeçalhos normais do sistema indisponíveis, por exemplo, mudar o nome da pasta. Esperemos que a construção vai cair na falta de encontrar um cabeçalho e ele vai lhe dizer exatamente onde.

Outras dicas

Tente preprocess gpg_error-gpg-error.c com -E então procurar os símbolos que faltam. Você deve encontrar de onde há inclued (algo como asm ( "_" "agradável" "@ UNIX2003"). Em seguida, modificar este header (unistd.h por exemplo, para adicionar um #warning "aqui"). Agora, recompilação, e você deve encontrar a pilha de incluir.

O sufixo $ 2003 é gerado pelo compilador em algumas circunstâncias onde pode encontrar plenamente documentados na entrada manual para compat

man compat

Eu lutei com isso por algum tempo antes de corrigi-lo, finalmente, definindo

-mmacosx-version-min=10.3

Qualquer versão anterior para 10,4 irá fazer o trabalho. Eu suspeito que, dada a resposta de Troubadour I pode ser melhor fora à procura de bibliotecas erroneamente ligados utilizando a opção -t de ld

Espero que isso ajude.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top