Как ускорить компиляцию приложений Ubuntu (make, cmake, gcc)


11

Я собираю некоторые программы здесь, и у меня есть 4 ядра. Есть ли способ сказать make, cmakeили gccскомпилировать, используя все ядра или что-то на это влияет?

Ответы:


13

Если пакет поддерживает его, вы можете использовать -jфлаг, чтобы разрешить выполнение параллельных заданий, например:

make -j8

Более подробную информацию об этом флаге можно найти в вопросе Stackoverflow. Почему make -j работает лучше, если ему передается число, превышающее число доступных ядер? ,

Распределенная компиляция

Если у вас несколько машин, попробуйте distcc . На задействованных машинах sudo apt-get install distcc. Предполагая, что ваша сборочная машина 192.168.1.1:

  • на вспомогательных машинах запустите:

    sudo distccd --log-file=/tmp/distccd.log --daemon -a 192.168.1.1
    
  • На сборочной машине перед запуском configureили cmakeвам нужно указать хосты, которые вы хотите использовать для процесса сборки. При желании укажите количество одновременных заданий после косой черты (по умолчанию 4):

    export DISTCC_HOSTS='localhost/4 192.168.1.2/8 192.168.1.3/8'
    

    Заставьте компилятор использовать distcc:

    export PATH="/usr/lib/distcc:$PATH"
    

    Теперь configureили cmakeприложение и построить с:

    make -j$(distcc -j)
    

    Обратите внимание, что если вы /usr/lib/distccдважды вставите в PATH, он потерпит неудачу. Не забудьте установить /usr/lib/distccтолько один раз в вашем PATH.

Для получения дополнительной информации см. Справочные страницы для distcc (1) и distccd (1) .


О боже, что J это хорошо. Я пошел с 15 минут до менее чем 1. Спасибо Л.
Луис Альварадо

С помощью distcc он может работать быстрее, компиляция PHP была выполнена за 2 минуты, ядро ​​- за 3 минуты (три машины i5)
Лекенштейн

Попробую с distcc, когда доберусь до работы. Задавал подобный вопрос об этом вчера. Может быть, вы можете помочь с этим здесь: askubuntu.com/questions/106810/…
Луис Альварадо

Запуск distccd от имени root кажется плохим планом. Я не использовал его по нескольким причинам, но когда я это сделал, я не смог использовать root, потому что у меня не было разрешения на эти машины.
Ams

@ams Вам не нужно запускать его как root. Если вы запускаете его как root и хотите переключать пользователей, используйте distccd --user nobody. В противном случае он будет работать под пользователем, который его выполнил.
Лекенстейн
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.