【问题标题】:How to change the amount of building threads in Xcode?如何在 Xcode 中更改构建线程的数量?
【发布时间】:2011-05-19 18:29:33
【问题描述】:

我正在 xcode 中构建几个 C++ 文件,这些文件需要大量内存来编译(+1 GB / 文件)。因为我在我的双核笔记本电脑上执行此操作,所以 xcode 使用 2 个线程进行构建。这两个线程最终将同时构建占用大量内存的文件,因此系统会遭受内存不足,编译几乎停止。

对我来说,一个足够的解决方案是强制 Xcode 只使用一个构建线程。有人知道改变 Xcode 使用多少构建线程的方法吗?

对于那些感兴趣的人,C++ 文件包含一个相当大的 boost::spirit::qi 解析器。

【问题讨论】:

    标签: c++ multithreading xcode compilation building


    【解决方案1】:

    Xcode 用于执行任务的线程数由PBXNumberOfParallelBuildSubtasks 选项控制。您可以使用以下命令更改它:-defaults write com.apple.Xcode <key> <value>。例如:

    defaults write com.apple.Xcode PBXNumberOfParallelBuildSubtasks 8
    

    更多详情请见Xcode User Defaults。

    还有许多其他方法可以加快编译速度,从预编译头文件到分布式构建。阅读Reducing Build Times了解更多信息。

    祝你好运!

    【讨论】:

    • 这正是我想要的,非常感谢。此外,减少构建时间的部分也很有趣。
    • 试试这个默认写com.apple.dt.Xcode IDEBuildOperationMaxNumberOfConcurrentCompileTasks`sysctl -n hw.ncpu`
    【解决方案2】:

    一个构建任务不应该两次做同样的工作,当然也不应该同时做!将大量通用代码分解到一个静态库中,以便只有在它发生更改时才能重新编译。在您的应用程序中对静态库和静态库产品中的链接设置目标依赖关系。对应用程序其余部分的更改将不再需要重新构建静态库,这将大大加快构建时间。

    在将 Xcode 作为一个整体进行操作之前,请尝试用尽所有项目级解决方案。很容易将 Xcode 削弱为只使用单个线程,而当您继续进行新项目时忘记将其更改回来。 Xcode User Default Reference 记录了许多未通过 Preferences 界面公开的选项,包括:

    • PBXNumberOfParallelBuildSubtasks(正整数)

      这允许您将 Xcode 限制为在其编译的每个项目上仅使用 n 个构建线程。

    • BuildSystemCacheSizeInMegabytes(正整数,默认1024)

    • BuildSystemCacheMinimumRemovalAgeInHours(正整数,默认24)

      增加 PCH 缓存大小和保留时间有助于加快构建速度。

    【讨论】:

    • 这不是同一个工作,它们实际上是几个文件,编译内存使用量很大。同样的文件也被构建了两次,因为 Xcode 构建了 64 位和 32 位版本,然后将它们合并。静态库对我没有多大帮助,因为我目前正在处理这些文件。不过,感谢您的回答, PBXNumberOfParallelBuildSubtasks 正是我所需要的。一个更持久的解决方案是在我的 PC 上添加一些 RAM,我没有意识到编译任务会占用这么多内存。
    • 有谁知道 BuildSystemCacheSizeInMegabytes 是否还有效果?
    【解决方案3】:

    对于 Xcode 4,您必须设置 IDEBuildOperationMaxNumberOfConcurrentCompileTasks 用户默认值,例如:

    defaults write com.apple.dt.Xcode IDEBuildOperationMaxNumberOfConcurrentCompileTasks 4
    

    注意“dt”。这不会影响命令行上的 xcodebuild。为此,请使用类似

    xcodebuild -IDEBuildOperationMaxNumberOfConcurrentCompileTasks=4 ...
    

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

    【讨论】:

    • 这似乎不再适用于 Xcode 7 - 关于现在如何指定作业数量的任何想法?
    【解决方案4】:

    使用 XCode 5,您可以将 -parallelizeTargets 和 -jobs NUMBER 与 xcodebuild 一起使用。根据xcodebuild --help:

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

    【讨论】:

    • 启用 Xcode 9+ 中的新构建系统后,-parallelizeTargets 似乎是多余的,在我的测试中,它对编译时间没有影响。
    猜你喜欢
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    相关资源
    最近更新 更多