2010-12-03 23 views
13

Je crée deux fichiers C++ dans xcode qui nécessitent beaucoup de mémoire pour être compilés (+1 Go/fichier). Parce que je le fais sur mon ordinateur portable dual core, xcode utilise 2 threads pour la construction. Les deux threads finiront par construire les fichiers qui prennent beaucoup de mémoire simultanément, de sorte que le système souffre de la famine de la mémoire et que la compilation finit par s'arrêter.Comment changer la quantité de threads de construction dans Xcode?

Une solution suffisante pour moi serait de forcer Xcode à utiliser seulement un thread de construction. Est-ce que quelqu'un sait comment changer le nombre de threads de construction utilisés par Xcode?

Pour ceux qui sont intéressés, les fichiers C++ contiennent un parseur boost :: spirit :: qi.

Répondre

12

Le nombre de threads que Xcode utilise pour effectuer des tâches est contrôlé par l'option PBXNumberOfParallelBuildSubtasks. Vous pouvez le modifier avec la commande suivante: - defaults write com.apple.Xcode <key> <value>. Par exemple:

defaults write com.apple.Xcode PBXNumberOfParallelBuildSubtasks 8 

Voir Xcode User Defaults pour plus de détails.

Il existe également de nombreux autres moyens d'accélérer une compilation, des en-têtes précompilés aux builds distribués. Lire Reducing Build Times pour plus d'informations à ce sujet.

Bonne chance!

+0

C'est exactement ce que je cherchais, merci beaucoup. Aussi la partie sur la réduction des temps de construction est une lecture intéressante. –

+5

Les liens ne fonctionnent plus longtemps – Remover

+0

Essayez ce paramètre par défaut écrire com.apple.dt.Xcode IDEBuildOperationMaxNumberOfConcurrentCompileTasks '' sysctl -n hw.ncpu' ' – Maximelc

0

Une tâche de construction unique ne devrait jamais faire le même travail deux fois, et certainement pas simultanément! Factoriser le morceau massif de code commun dans une bibliothèque statique afin qu'il puisse être recompilé seulement quand il change. Définissez une dépendance cible dans votre application sur la bibliothèque statique et un lien dans le produit de bibliothèque statique. Les modifications apportées au reste de votre application ne nécessiteront plus de reconstruction de la bibliothèque statique, ce qui devrait accélérer considérablement les temps de construction. Essayez d'épuiser toutes les solutions au niveau du projet avant de manipuler Xcode dans son ensemble. Il est trop facile de paralyser Xcode pour n'utiliser qu'un seul thread et d'oublier de le changer lorsque vous passez à un nouveau projet. Les Xcode User Default Reference documents de nombreuses options qui ne sont pas exposées via l'interface Préférences, y compris:

  • PBXNumberOfParallelBuildSubtasks (entier positif)

    Cela vous permet de limiter Xcode à utiliser uniquement n construire les discussions sur tous les projet qu'il compile.

  • BuildSystemCacheSizeInMegabytes (entier positif, par défaut 1024)

  • BuildSystemCacheMinimumRemovalAgeInHours (entier positif, par défaut 24)

    Upping la taille du cache PCH et le temps de rétention pourrait aider à accélérer votre builds.

+0

Ce n'est pas le même travail, ils sont en fait plusieurs fichiers avec une énorme utilisation de la mémoire de compilation . Les mêmes fichiers sont également créés deux fois car Xcode crée à la fois une version 64 bits et une version 32 bits, puis les fusionne ensuite. Une lib statique ne m'aidera pas beaucoup car je travaille actuellement sur ces fichiers. Merci pour votre réponse si, le PBXNumberOfParallelBuildSubtasks est exactement ce dont j'avais besoin. Une solution plus permanente serait d'ajouter de la RAM à mon PC, je ne savais pas que les tâches de compilation pouvaient prendre autant de mémoire. –

4

Pour Xcode 4, vous devez définir la valeur par défaut de l'utilisateur de IDEBuildOperationMaxNumberOfConcurrentCompileTasks, par exemple:

defaults write com.apple.dt.Xcode IDEBuildOperationMaxNumberOfConcurrentCompileTasks 4 

Notez le "dt". Cela n'affectera pas xcodebuild sur la ligne de commande.Pour ce faire, utilisez quelque chose comme

xcodebuild -IDEBuildOperationMaxNumberOfConcurrentCompileTasks=4 ... 

(Voir http://lists.apple.com/archives/xcode-users/2011/Apr/msg00403.html et http://lists.apple.com/archives/xcode-users/2011/Jul//msg00377.html)

+1

Cela semble ne plus fonctionner avec Xcode 7 - des idées pour spécifier le nombre de travaux maintenant? –

8

Avec XCode 5, vous pouvez utiliser -parallelizeTargets et -jobs NUMBER avec xcodebuild. Selon xcodebuild --help:

-parallelizeTargets  build independent targets in parallel 
-jobs NUMBER   specify the maximum number of concurrent build operations 
+0

-jobs 8 aide, merci. – BillHoo