web-dev-qa-db-fra.com

Développeur de logiciels Basculement de Linux à OS X, quels sont les gothas?

J'ai utilisé Ubuntu/Fedora/Red Hat/Suse, mais je n'ai pas utilisé OS X du tout. Si je dois commencer à utiliser OS X régulièrement, quelles sont les choses que je devrais rechercher?

Outils que j'utilise sont GNU, C++/Boost, etc.

51
grokus

J'ai fait le même mouvement il y a des années. Voici les choses que j'ai rencontrées:

  • Votre Moyen Desktop Linux a une zone utiligne plus riche que celle du système d'exploitation X.

    Vous manquerez probablement différents outils que je ne l'ai fait, alors aucun sens ne devient spécifique des recommandations de remplacement.

    Au lieu de cela, il suffit d'installer Fink , MacPorts , ou homebrew première chose. Ces systèmes fournissent un système de gestion de paquets typique de Linux ou des BSDS. Chacun a sa propre saveur et son ensemble de paquets, de sorte que le bon choix sera basé sur vos goûts et vos besoins.

    Vous constaterez peut-être que tout système de paquet n'aura que chaque programme dont vous avez besoin. Certains programmes doivent encore être portés à OS X, de sorte qu'ils n'apparaîtront pas dans tout Système de paquet. Néanmoins, ces systèmes élargissent considérablement les navires avec OS X et faciliteront votre transition de Linux.

  • compilateurs de ligne de commande OS X construisez maintenant 64 bits exécutables par défaut.

    À Léopard et plus tôt, les compilers ont construit des exécutables 32 bits par défaut. Cela peut causer des problèmes de plusieurs manières: peut-être que vous n'avez peut-être pas de vieilles bibliothèques 32 bits que vous ne pouvez pas reconstruire mais que vous devez créer un lien vers, peut-être que vous exécutez toujours votre système en mode 32 bits, etc.

    Une façon de forcer une construction 32 bits consiste à remplacer les valeurs par défaut gcc dans les systèmes de construction avec gcc-4.0, qui étant l'ancien compilateur léopard 32 bits par défaut. (gcc est un lien symbolique vers le 64 bits par défaut gcc-4.2 sur la neige Leopard.) Avec des systèmes de construction basés sur Autoconf, cela fonctionne:

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

    (Vous avez seulement besoin du bit CXX si le programme contient des composants C++.)

    Une autre façon est de passer -m32 au compilateur et à la liaison:

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

    C'est plus en dactylographie, mais cela vous permet d'obtenir 32 bits de sortir du plus récent GCC.

  • La liaison dynamique est vaste différente.

    Si vous êtes le genre pour écrire vos commandes ld à la main, il est temps de casser cette habitude. Vous devez plutôt relier des programmes et des bibliothèques via le compilateur ou d'utiliser un intermédiaire comme libtool. Celles-ci s'occupent des différences de schéma de liaison spécifiques à la plate-forme Nigly, vous permettant ainsi de sauvegarder la puissance cérébrale pour les programmes d'apprentissage que vous ne pouvez pas abstraire avec des mécanismes portables.

    Par exemple, vous devrez mettre à jour votre mémoire musculaire afin de taper otool -L someprogram au lieu de ldd someprogram pour déterminer quelles bibliothèques someprogram sont liées.

    Une autre différence de liaison dynamique qui tordera votre cerveau au début, c'est que sur OS X, l'emplacement d'installation d'une bibliothèque est enregistré dans la bibliothèque elle-même et la liaison copie dans l'exécutable au lien temps. Cela signifie que si vous associez à une bibliothèque qui a été installé dans /usr/local/lib, mais que vous souhaitez l'expédier à vos utilisateurs dans le même répertoire que l'exécutable, vous devez dire quelque chose comme celui-ci dans le cadre de votre processus d'installation:

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

    Maintenant, une grande partie de ce qui précède est susceptible de varier pour votre système de construction, alors prenez-la comme exemple, plutôt qu'une recette. Ce que cela fait est une copie privée d'une bibliothèque que nous litigons, modifie son identifiant de bibliothèque partagé d'un chemin absolu à un sens relatif de la signification "dans le même répertoire que l'exécutable", oblige une reconstruction de l'exécutable contre cette copie modifiée. de la bibliothèque.

    install_name_tool est la commande principale ici. Si vous vouliez plutôt installer la bibliothèque dans un répertoire ../lib par rapport à l'exécutable, l'argument -id devrait être @loader_path/../lib/libfoo.dylib.

    Joe Di Pol a écrit n bon article sur ceci , avec beaucoup plus de détails.

  • Linkage dynamique + Les forfaits tiers peuvent causer des maux de tête tôt.

    Vous êtes susceptible de courir dans des problèmes de liaison dynamiques tôt, dès que vous commencerez à essayer d'utiliser des bibliothèques à partir de packages tiers qui n'installent pas les bibliothèques dans des emplacements standard. MacPorts Cela, par exemple, d'installer des bibliothèques dans /opt/local/lib, plutôt que /usr/lib ou /usr/local/lib. Lorsque vous rencontrez cela, une bonne solution pour le problème consiste à ajouter des lignes comme les suivantes à votre .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
    
  • OS X gère le problème de compatibilité de la CPU différemment de Linux.

    Sur un Linux 64 bits où vous devez également prendre en charge 32 bits pour une raison quelconque, vous vous retrouvez avec deux copies de choses comme des bibliothèques qui doivent être dans les deux formats, avec les versions 64 bits éteintes dans un répertoire lib64 parallèlement à Le répertoire traditionnel lib.

    OS X résout ce problème différemment, avec le concept binaire universel, ce qui vous permet de placer plusieurs binaires dans un seul fichier. Vous pouvez actuellement avoir des exécutables qui prennent en charge jusqu'à 4 types de CPU: PowerPC 32 et 64 bits, plus 32 et 64 bits Intel.

    Il est facile de construire des fichiers binaires universels avec Xcode, mais un peu de douleur avec des outils de ligne de commande. Cela vous propose une construction universelle de Intel uniquement avec des systèmes de construction basés sur AutoConf:

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

    Ajouter -Arch ppc -Arch ppc64 au CFLAGS et LDFLAGS Si vous avez besoin d'un support PowerPC.

    Si vous ne désactivez pas le suivi de la dépendance, vous ne trouvez que sur la construction uniquement pour une plate-forme, car la présence de fichiers .o nouvellement construits pour la première plate-forme convainc make(1) Il n'a pas besoin de construire pour la seconde. plate-forme aussi. Tout doit être construit deux fois dans l'exemple ci-dessus; Quatre fois pour un binaire entièrement universel, si vous avez toujours besoin d'un support PowerPC.

    (Plus d'infos dans Note technique Apple TN2137 .)

  • Les outils de développement ne sont pas installés sur OS X par défaut.

    Avant le lion, l'endroit le plus fiable pour obtenir les bons outils de développement pour votre système était sur les disques du système d'exploitation. Ils sont une installation optionnelle.

    La bonne chose à propos de l'installation des outils DEV à partir des disques du système d'exploitation est que vous savez que les outils fonctionnent avec le système d'exploitation. =Apple Etre Apple, vous devez avoir une version récente du système d'exploitation pour exécuter les derniers compilateurs, et ils n'ont pas toujours effectué des téléchargements d'anciens outils disponibles, de sorte que les disques du système d'exploitation sont souvent les plus faciles. façon de trouver les bons outils pour un développement ou une boîte de test donnée.

    Avec Lion, ils essaient d'éliminer les médias d'installation, alors à moins que vous achetiez la version chère de clé USB, vous devrez Télécharger Xcode à partir de l'App Store .

    Je vous recommande de garder au moins quelques versions de n'importe quel Xcode DMGS que vous téléchargez. Lorsque le successeur de Lion sort un an ou trois donc, vous pouvez vous retrouver sans un moyen d'installer une version contemporaine de Xcode sur un test de test de lion. Planifiez à l'avance dans le cas où les problèmes de disponibilité et l'absence de média d'OS rendent d'anciennes versions de Xcode autrement incroyable.

53
Warren Young

Un système de fichiers GOTCHA - Mac OS n'est pas sensible à la casse.

30
gabe.

Bien que Fink et Macports soient les moyens traditionnels d'obtenir des forfaits UNIX sur OS X, je vous recommanderais de vérifier un nouvel outil appelé brew qui a fonctionné mieux pour moi et sans gâche avec mon système et est beaucoup plus facile de utilisation. Il suffit de télécharger des tagales et des installations sur/usr/local, mais elle automatise très bien tout le processus.

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

9
Sandy

Un système de fichiers GOTCHA - Mac OS n'est pas sensible à la casse.

Vous pouvez créer une image de disque sensible à la casse sur Mac OS X, qui peut être montée sous forme de volume de disque dur normal.

# 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

Lorsque vous portez une pile réseau de Solaris, BSD, Linux et Windows à OSX, le seul point principal qui fait l'objet d'une attention particulière est que beaucoup comme FreeBSD toute la chaîne d'outils est assez ancienne.

Apple accélère avec OSX Lion mais Leopard, Snow Leopard est jolie derrière les distributions de Linux modernes et de nombreuses normes ne sont pas prises en charge. Dans mon cas, je suis touché par manque de RFC 3678 (extensions d'interface de socket pour filtres à source de multidiffusion) étant assez gênante.

Sur OSX Server, j'ai installé un système de fichiers sensible à la casse au fur et à mesure qu'il le recommande de le faire pour servir HTTP.

  • Vieux GCC
  • Ancien Autoconf, Automake, Libtool
  • Pas de spinlocks Pthread, OSX fournit des alternatives natives.
  • Pas beaucoup d'API NSS RE-RIENTRANT.
  • Pas trop utile /proc système de fichiers.
  • Non /dev/rtc, /dev/hpet, et RDTSC semble être gimped. OSX fournit des alternatives natives.
  • No epoll, mais vous avez poll et kquue
3
Steve-o

Voici une bonne source d'articles de développement sélectionnés, la liste de littérature de cacao:

http://osx.hyperjeff.net/reference/cocoaartures

(Cela peut être particulièrement utile si un jour, vous souhaitez utiliser des goodies spécifiques Mac OS X.)

3
frank

OS X prend en charge pthread_cond_timedwait Mais il utilise le temps de calendrier absolu et il n'ya aucun moyen d'utiliser une période croissante monotone.

1
andrewrk