ti-enxame.com

Desenvolvedor de software que muda do Linux para o OS X, quais são as vantagens?

Eu usei o Ubuntu/Fedora/Red Hat/Suse, mas não usei o OS X. Se eu tiver que começar a usar o OS X regularmente, quais são as coisas que devo procurar?

As ferramentas que eu uso são GNU, C++/Boost, etc.).

51
grokus

Eu fiz a mesma jogada anos atrás. Aqui estão as coisas que eu encontrei:

  • Seu Linux de desktop médio tem uma área de usuário mais rica que a do OS X.

    Você provavelmente perderá ferramentas diferentes das que eu fiz, portanto, não faz sentido ficar específico sobre as recomendações para substituições.

    Em vez disso, basta instalar Fink , MacPorts ou Homebrew a primeira coisa. Esses sistemas fornecem um sistema de gerenciamento de pacotes típico do Linux ou dos BSDs. Cada um tem seu próprio sabor e conjunto de embalagens, portanto, a escolha certa será baseada em seus gostos e necessidades.

    Você pode achar que nenhum sistema de pacote terá todos os programas que você precisa. Alguns programas ainda precisam ser portados para o OS X, para que não apareçam no sistema de pacotes any. No entanto, esses sistemas estendem bastante o que é fornecido com o OS X e facilitarão sua transição do Linux.

  • Os compiladores de linha de comando do OS X agora criam executáveis ​​de 64 bits por padrão.

    No Leopard e versões anteriores, os compiladores criavam executáveis ​​de 32 bits por padrão. Isso pode causar problemas de várias maneiras: talvez você tenha bibliotecas antigas de 32 bits que não podem ser reconstruídas, mas precisa vincular, talvez ainda esteja executando o sistema no modo de 32 bits, etc.

    Uma maneira de forçar uma compilação de 32 bits é substituir os padrões gcc nos sistemas de compilação com gcc-4.0, Que é o antigo compilador Leopard de 32 bits por padrão. (gcc é um link simbólico para o padrão de 64 bits gcc-4.2 no Snow Leopard.) Nos sistemas de construção baseados em autoconf, isso funciona:

    $ ./configure CC=gcc-4.0 CXX=g++-4.0
    

    (Você só precisa do bit CXX se o programa contiver componentes C++.)

    Outra maneira é passar -m32 Para o compilador e vinculador:

    $ ./configure CFLAGS=-m32 CXXFLAGS=-m32 LDFLAGS=-m32
    

    É mais digitado, mas permite que você obtenha compilações de 32 bits do GCC mais recente.

  • O vínculo dinâmico é muito diferente.

    Se você é do tipo que escreve seus comandos ld manualmente, é hora de quebrar esse hábito. Em vez disso, você deve vincular programas e bibliotecas através do compilador ou usar um intermediário como libtool. Eles cuidam das diferenças de esquema de link específicas da plataforma, para que você possa economizar o poder do cérebro em programas de aprendizado que não pode abstrair com mecanismos portáteis.

    Por exemplo, você precisará atualizar sua memória muscular para digitar otool -L someprogram Em vez de ldd someprogram Para descobrir a quais bibliotecas someprogram estão vinculadas.

    Outra diferença no vínculo dinâmico que irá distorcer seu cérebro a princípio é que, no OS X, o local de instalação de uma biblioteca é registrado na própria biblioteca, e o vinculador o copia no executável no link Tempo. Isso significa que, se você vincular a uma biblioteca que foi instalada em /usr/local/lib, Mas desejar enviá-la aos seus usuários no mesmo diretório que o executável, precisará dizer algo como isso como parte do seu processo de instalação:

    $ cp /usr/local/lib/libfoo.dylib .
    $ install_name_tool -id @loader_path/libfoo.dylib libfoo.dylib
    $ make LDFLAGS=-L. relink
    

    Agora, é provável que grande parte do exposto varie para o seu sistema de compilação, então tome isso como um exemplo, e não como uma receita. O que isso faz é criar uma cópia privada de uma biblioteca à qual vinculamos, alterar seu identificador de biblioteca compartilhada de um caminho absoluto para um significado relativo "no mesmo diretório que o executável" e forçar a reconstrução do executável contra essa cópia modificada da biblioteca.

    install_name_tool É o comando principal aqui. Se, em vez disso, você desejasse instalar a biblioteca em um diretório ../lib Relativo ao executável, o argumento -id Precisaria ser @loader_path/../lib/libfoo.dylib.

    Joe Di Pol escreveu m bom artigo sobre isso , com muito mais detalhes.

  • O vínculo dinâmico + os pacotes de terceiros podem causar dores de cabeça desde o início.

    É provável que você tenha problemas de ligação dinâmica desde o início, assim que começar a tentar usar bibliotecas de pacotes de terceiros que não instalam as bibliotecas em locais padrão. MacPorts faz isso, por exemplo, instalando bibliotecas em /opt/local/lib, Em vez de /usr/lib Ou /usr/local/lib. Quando você se deparar com isso, uma boa solução para o problema é adicionar linhas como as seguintes ao seu .bash_profile:

    # Tell the dynamic linker (dyld) where to find MacPorts package libs
    export DYLD_LIBRARY_PATH=/opt/local/lib:$DYLD_LIBRARY_PATH
    
    # Add MacPorts header file install dirs to your gcc and g++ include paths
    export C_INCLUDE_PATH=/opt/local/include:$C_INCLUDE_PATH
    export CPLUS_INCLUDE_PATH=/opt/local/include:$CPLUS_INCLUDE_PATH
    
  • O OS X lida com o problema de compatibilidade da CPU de maneira diferente do Linux.

    Em um Linux de 64 bits em que você também precisa suportar 32 bits por qualquer motivo, você acaba com duas cópias de bibliotecas que precisam estar nos dois formatos, com as versões de 64 bits desativadas em lib64 paralelo ao diretório lib tradicional.

    O OS X resolve esse problema de maneira diferente, com o conceito binário Universal, que permite colocar vários binários em um único arquivo. Atualmente, você pode ter executáveis ​​que suportam até 4 tipos de CPU: PowerPC de 32 e 64 bits, além de Intel de 32 e 64 bits.

    É fácil criar binários universais com o Xcode, mas é um pouco trabalhoso com as ferramentas de linha de comando. Isso proporciona uma compilação universal da Intel, apenas com sistemas de compilação baseados no Autoconf:

    $ ./configure --disable-dependency-tracking CFLAGS='-Arch i386 -Arch x86_64' \
      LDFLAGS='-Arch i386 -Arch x86_64'
    

    Adicione -Arch ppc -Arch ppc64 Aos CFLAGS e LDFLAGS se precisar de suporte do PowerPC.

    Se você não desativar o rastreamento de dependências, acaba criando apenas uma plataforma, pois a presença de arquivos .o Recém-criados para a primeira plataforma convence make(1) de que ela não precisa para construir para a segunda plataforma também. Tudo deve ser construído duas vezes no exemplo acima; quatro vezes para um binário totalmente universal, se você ainda precisar do suporte ao PowerPC.

    (Mais informações em Nota técnica da Apple TN2137 .)

  • As ferramentas do desenvolvedor não estão instaladas no OS X por padrão.

    Antes do Lion, o local mais confiável para obter as ferramentas de desenvolvimento corretas para o seu sistema era nos discos do sistema operacional. Eles são uma instalação opcional.

    O legal de instalar as ferramentas de desenvolvimento a partir dos discos do SO é que você sabe que as ferramentas funcionarão com o SO. Apple sendo Apple, você precisa ter uma versão recente do sistema operacional para executar os compiladores mais recentes, e eles nem sempre disponibilizam downloads de ferramentas antigas, portanto os discos do sistema operacional são frequentemente os mais fáceis maneira de encontrar as ferramentas certas para um determinado desenvolvedor ou caixa de teste.

    Com o Lion, eles estão tentando acabar com a instalação de mídia. Portanto, a menos que você compre a versão cara da chave USB, terá que fazer o download do Xcode na App Store .

    Eu recomendo que você mantenha pelo menos algumas versões de quaisquer DMGs do Xcode que você baixar. Quando o sucessor do Lion for lançado daqui a um ou três anos, você poderá encontrar uma maneira de instalar uma versão contemporânea do Xcode em uma VM de teste do Lion. Planeje com antecedência, caso os problemas de disponibilidade e a falta de mídia do SO tornem impossíveis as versões antigas do Xcode.

53
Warren Young

GOTCHA ENORME - O sistema de arquivos do Mac OS NÃO diferencia maiúsculas de minúsculas.

30
gabe.

Embora o Fink e o MacPorts sejam os meios tradicionais de obter pacotes unix no OS X, eu recomendo verificar uma ferramenta mais nova chamada brew que funcionou melhor para mim e mexeu menos com o meu sistema, e é muito mais fácil de usar. usar. Basicamente, apenas baixa tarballs e instala em/usr/local, mas automatiza todo o processo muito bem.

http://mxcl.github.com/homebrew/

9
Sandy

GOTCHA ENORME - O sistema de arquivos do Mac OS NÃO diferencia maiúsculas de minúsculas.

Você pode criar uma imagem de disco que diferencia maiúsculas de minúsculas no Mac OS X que pode ser montada como um volume normal do disco rígido.

# cf. http://codesnippets.joyent.com/posts/show/8617
IMAGE="${HOME}/Desktop/Case Sensitive Test.dmg"
VOLNAME="Case Sensitive Test"

hdiutil create "${IMAGE}" -size 10m -fs HFSX -volname "${VOLNAME}" -layout NONE

hdiutil attach "${IMAGE}"

cd "/Volumes/${VOLNAME}"
touch foo.txt Foo.txt
open .
ls -l [Ff]oo.txt
stat -f "inode: %i  --  name: %N" [Ff]oo.txt

cd ~
hdiutil detach "/Volumes/${VOLNAME}"
4
taco

Ao transportar uma pilha de rede do Solaris, BSD, Linux e Windows para OSX, o único ponto principal que chama a atenção é que, assim como o FreeBSD, toda a cadeia de ferramentas é bastante antiga.

A Apple está acelerando com o OSX Lion, mas o Leopard, o Snow Leopard estão bem atrás das modernas distribuições Linux e muitos padrões não são suportados. No meu caso, sou atingido com a falta de RFC 3678 (extensões de interface de soquete para filtros de origem multicast) sendo bastante inconveniente.

No servidor OSX, instalei um sistema de arquivos com distinção entre maiúsculas e minúsculas, pois é recomendado para a veiculação HTTP.

  • Antigo CCG
  • Autoconf antigo, Automake, libtool
  • Sem spinlocks Pthread, o OSX fornece alternativas nativas.
  • Não há muitas APIs NSS re-alugadas.
  • Não é muito útil /proc sistema de arquivo.
  • Não /dev/rtc, /dev/hpet e RDTSC parecem estar limitados. OSX fornece alternativas nativas.
  • Não epoll, mas você tem poll e kqueue
3
Steve-o

Aqui está uma boa fonte de artigos de desenvolvimento selecionados, a lista de literatura de cacau:

http://osx.hyperjeff.net/Reference/CocoaArticles

(Isso pode ser especialmente útil se um dia você desejar usar itens específicos do Mac OS X.)

3
frank

O OS X suporta pthread_cond_timedwait, mas usa o tempo absoluto do calendário e não há como usar um tempo monotonicamente crescente.

1
andrewrk