Использвать компилятор GNU g++ вместо c++ на mac os
У меня есть проект на С++, который я ранее писал на компе с Ubuntu, а недавно пересел на мак и теперь хочу продолжить работу уже на нём. Есть makefile, в котором есть следующая строчка:
$(DELTA): $(SRC)/atlantida/delta.o g++ -o $(BUILD)/atlantida/$(DELTA) $(SRC)/atlantida/delta.o delta.o: $(SRC)/atlantida/delta.cpp g++ -O0 -g -Wall -c $(SRC)/atlantida/delta.cpp
Но при запуске make в выводе терминала я вижу, что используется ещё и с++, который собирает исполняемый файл из объектного:
c++ -c -o src//atlantida/delta.o src//atlantida/delta.cpp g++ -o ./build//atlantida/delta.exe ./src//atlantida/delta.o
Дело в том, что c++ —version показывает, что c++ — это эпловский clang:
ivan@MacBook-Pro-Ivan projectAntares % c++ --version Apple clang version 14.0.0 (clang-1400.0.29.202) Target: arm64-apple-darwin22.3.0 Thread model: posix InstalledDir: /Library/Developer/CommandLineTools/usr/bin
- Почему мак использует свой компилятор c++, если я в makefile прошу его использовать g++
- Как его заставить собирать исполняемый файл именно при помощи GNU g++ (gcc) вместо Clang?
На всякий случай:
ivan@MacBook-Pro-Ivan projectAntares % which gcc /opt/homebrew/bin/gcc ivan@MacBook-Pro-Ivan projectAntares % which g++ /opt/homebrew/bin/g++ ivan@MacBook-Pro-Ivan projectAntares % gcc --version gcc (Homebrew GCC 12.2.0) 12.2.0 Copyright (C) 2022 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ivan@MacBook-Pro-Ivan projectAntares % g++ --version g++ (Homebrew GCC 12.2.0) 12.2.0 Copyright (C) 2022 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
P.S.У меня mac os Ventura 13.2.1, макбук с M1 Pro. Если для ответов на вопросы понадобится что-то ещё, я оперативно подгружу всё, что нужно)
Как установить компилятор c на mac
Для компиляции программы на Си в MacOS одним из наиболее популярных компиляторов является Clang (стоит отметить, что clang может также применяться для компиляции программы на C++ и Objective-C). Считается, что clang работает быстрее и потребляет меньше памяти, чем GCC. Для работы с clang в MacOS необходимо установить утилиту Xcode Command Line Tools . Самой простой способ установить эту утилиту — установить сам XCode, с которым автоматически устанавливается и Xcode Command Line Tools.
Для работы определим в файловой системе каталог для исходных файлов с кодом на Си и создадим в нем новый файл hello.c со следующим кодом:
#include // подключаем заголовочный файл stdio.h int main(void) // определяем функцию main < // начало функции printf("Hello METANIT.COM! \n"); // выводим строку на консоль return 0; // выходим из функции >// конец функции
Этот код аналогичен тому, что применялся в случае с Windows и Linux.
Чтобы вывести строку на консоль, необходимо подключить подключает заголовочный файл stdio.h с помощью директивы include.
#include
Этот заголовочный файл содержит определение функции printf, которая нужна для вывода строки на консоль.
Далее идет определение функции int main(void) — главной функции, которая должна присутствовать в любой программе на Си. С нее собственно и начинается выполнение приложения.
Ключевое слово int в определении функции int main(void) говорит о том, что функция возвращает целое число. А слово void в скобках указывает, что функция не принимает параметров. А все содержимое функции заключается в фигурные скобки.
В самой функции происходит вывод строки на консоль с помощью функции printf, в которую передается выводимая строка «Hello METANIT.COM!».
В конце осуществляем выход из функции с помощью оператора return . Так как функция должна возвращать целое число, то после return указывается число 0. Ноль используется в качестве индикатора успешного завершения программы.
Перейдем к терминалу и вначале с помощью команды cd перейдем к каталогу, где расположен файл с исходным кодом.
Далее для компиляции программы введем команду
clang hello.c
В итоге в папке с файлом hello.c появился скомпилированный файл, который по умолчанию называется a.out . Запустим его с помощью следующей команды:
./a.out
И на консоль будет выведена строка «Hello METANIT.COM!».
При компиляции с помощью флага -o можно задать имя выходного файла:
clang hello.c -o app
В этом случае будет компилироваться файл app , который также будет находиться в папке с файлом hello.c. И в этом случае мы его можем запустить следующим образом:
Компиляция C/C++ на Apple M1

Заинтригованный впечатляющими бенчмарками M1, я достал последний Mac Mini, чтобы замерить скорость компиляции на C/C++.
Измеряем локальный build2 (без репозитория пакетов), который включает преимущественно код на C++ (611 единиц трансляции) с некоторыми блоками на C (29) и связками между ними (19). Такой бенчмарк требует только компилятора C++ и входит в тестовый набор Phoronix, поэтому можно сравниться с большим количеством процессоров.
Бенчмарк Phoronix в настоящее время использует build2 0.12.0, у нас 0.13.0 (текущий релиз), здесь сборка выполняется примерно на 10% медленнее.
После настройки Mac OS и установки инструментов командной строки для XCode 12.2 у нас есть всё необходимое:
$ clang++ --version Apple clang version 12.0.0 (clang-1200.0.32.27) Target: arm64-apple-darwin20.1.0
Судя по _LIBCPP_VERSION в заголовке __version файла libc++ , эта версия Apple Clang ответвилась от ванильного Clang где-то в процессе разработки 10.0.0.
Возможно, вы также заметили, что название процессора в триплете Apple Clang отличается от стандартного aarch64 . На самом деле config.guess показывает следующее:
$ ./config.guess aarch64-apple-darwin20.1.0
Чтобы не использовать два названия для одного и того же, build2 канонизировал arm64 в aarch64 , поэтому в buildfiles мы всегда видим aarch64.
Проверим количество аппаратных потоков в sysctl :
$ sysctl -n hw.ncpu 8
Здесь 8 потоков, это 4 производительных ядра и 4 энергоэффективных. В первом прогоне задействуем все ядра. Очевидно, это даёт наилучший результат:
$ time sh ./build2-install-0.13.0.sh --local --yes ~/install 163s
Приятным сюрпризом оказалось то, что build2 0.13.0 заработал без особых проблем, хотя он вышел раньше M1. Поскольку в ARM слабое упорядочение памяти, это также послужило дополнительной проверкой многопоточной реализации build2 и интенсивного использования атомиков.
Для начала сравним M1 с моей рабочей станцией на 8-ядерном Intel Xeon E-2288G (по сути, i9-9900K плюс ECC). Та же сборка на ванильном Clang занимает 131 с. Хотя это лучший результат, но производительность M1 всё равно впечатляет. Особенно если учесть, что во время компиляции рабочая станция буквально изрыгает горячий воздух и гудит как самолёт, а М1 тихо шуршит с едва заметным потоком тёплого воздуха.
Однопоточный бенчмарк оценивает производительность CPU в инкрементальных билдах:
$ time sh. /build2-install-0.13.0.sh --local --yes-j 1 ~ / install 691s
Ядро E-2288G справляется за 826 секунд. Таким образом, ядро Xeon на 5 ГГц на самом деле медленнее, чем ядро M1 на 3,2 ГГц.
Еще один интересный результат — четырёхпоточный прогон, который использует только производительные ядра М1:
$ time sh ./build2-install-0.13.0.sh --local --yes -j 4 ~/install 207s
Хотя он несколько медленнее восьмиядерного теста, но зато использует меньше памяти. Таким образом, такой вариант имеет смысл на системах с недостатком оперативной памяти (как на всех современных машинах M1).
Вот краткое изложение всех результатов:
CPU CORES/THREADS TIME ------------------------- E-2288G 8/16 131s M1 4+4 163s M1 4 207s M1 1 691s E-2288G 1 826s
Понятно, что во многих отношениях это сравнение яблок с апельсинами (рабочая станция против мобильного устройства, старый дизайн и техпроцесс против самого современного и т. д.)
Теперь добавим несколько интересных результатов из бенчмарка Phoronix. В частности, уместно взять показатели новейших рабочих станций и мобильных процессоров Intel и AMD. Вот моя подборка (можете составить собственную, только не забудьте добавить дополнительные 10% к результатам Phoronix; также обратите внимание, что в большинстве тестов используется GCC вместо Clang):
CPU CORES/THREADS TIME ------------------------------------------ AMD Threadripper 3990X 64/128 56s AMD Ryzen 5950X 16/32 71s Intel Xeon E-2288G 8/16 131s Apple M1 4+4 163s AMD Ryzen 4900HS 8/16 176s* Apple M1 4 207s AMD Ryzen 4700U 8/8 222s Intel Core 1185G 4/8 281s* Intel Core 1165G 4/8 295s * Экстраполяция.
Обратите внимание, что результаты для лучших мобильных Intel (1185G) и AMD (4900HS), к сожалению, ещё не доступны, и приведённые цифры экстраполированы на основе частоты и других бенчмарков.
Из приведённой выше таблицы легко понять, что Apple M1 — впечатляющий процессор, особенно с учётом энергопотребления. Более того, это первый общедоступный ARM-процессор настольного класса. Для сравнения, та же сборка на Raspberry Pi 4B занимает 1724 секунды, то есть более чем в 10 раз медленнее! Хотя мы не можем тут загрузить Linux или Windows, но есть некоторые свидетельства, что они работают на виртуальных машинах с приличной производительностью. В итоге, конвейер непрерывной сборки на базе ARM может стать стандартным.
Увидев бенчмарки M1, невольно задаёшься вопросом, как Apple такое удалось. Хотя есть много спекуляций с некоторыми элементами чёрной магии и колдовства, но вполне хорошим источником технической информации мне показалась эта статья о M1 на Anandtech (и ещё одна там по ссылке). Основные моменты:
Процесс TSMC 5 нм
По сравнению с интеловскими 10 нм (для 11x5G, 14 нм для E-2288G) и 7 нм у AMD/TSMC.
LPDDR4-4266 RAM
Только новейшие мобильные процессоры от Intel и AMD работают с такой быстрой памятью.
Большой кэш L1
У M1 необычно большой кэш L1 для команд и данных.
Большой и быстрый общий кэш L2
В отличие от процессоров Intel и AMD, которые используют отдельные кэши L2 меньшего объёма и большой, но более медленный общий кэш L3, в процессоре M1 реализован быстрый и большой общий кэш L2.
Широкое ядро
У M1 необычайно «широкое» ядро, которое выполняет несколько инструкций параллельно и/или не по порядку. Есть предположение, что из-за слабого упорядочения памяти ARM и кодирования команд фиксированного размера, Apple смогла сделать гораздо более широкое ядро.
Было бы также интересно посмотреть, как Apple сможет масштабировать эту конструкцию на большее количество ядер.
Как загрузить и установить компилятор GCC на языке C для ПК с Windows
Мы будем использовать интегрированную среду разработки с открытым исходным кодом под названием Code :: Blocks который объединяет компилятор (названный GCC предложенный Фондом свободного программного обеспечения GNU), редактор и отладчик в аккуратной упаковке.
Шаг 1) Загрузите двоичную версию
Перейдите на http://www.codeblocks.org/downloads и нажмите «Двоичный выпуск».

Шаг 2) Выберите установщик с компилятором GCC для Windows.
Выберите установщик с компилятором GCC, например, codeblocks-17.12mingw-setup.exe, который включает в себя загрузку компилятора GNU GCC от MinGW и отладчик GNU GDB с исходными файлами Code::Blocks.

Шаг 3) Начать установку
Запустите загруженный установщик и примите параметры по умолчанию для установки файла GCC Windows.

Шаг 4) Примите условия использования

Шаг 5) Сохраните выбор компонента по умолчанию.
Оставьте выбор компонента по умолчанию и нажмите «Далее».

Шаг 6) Найдите путь установки.
Вы можете изменить папку установки и нажать «Далее».

Шаг 7) Найдите и дважды щелкните значок CodeBlocks.
Чтобы запустить Code::Blocks, дважды щелкните значок.
Шаг 8) Пусть он обнаружит сам компилятор
Он автоматически обнаружит компилятор GCC для Windows и установит его по умолчанию.

Свяжите файлы C/C++ с code::blocks
Шаг 9) Откройте IDE и начните использовать
Вы увидите главный экран IDE.

Установить GCC Linux
Операционные системы Linux в большинстве случаев поставляются с предустановленным GCC. Чтобы проверить, установлен ли компилятор на компьютере, выполните в терминале следующую команду:
gcc --version
После выполнения этой команды, если на компьютере установлен gcc, он вернет информацию о компиляторе, в противном случае он попросит вас установить компилятор.
Чтобы настроить среду «C» на Linux дистрибутивы следуют заданным шагам:
1. Откройте терминал.
2. Для пользователей Red Hat и Fedora введите и выполните эту команду.
# yum groupinstall 'Development Tools'
3. Для пользователей Debian и Ubuntu введите и выполните следующую команду.
$ sudo apt-get update $ sudo apt-get install build-essential manpages-dev
4. Чтобы убедиться, что GCC успешно установлен на компьютере, как мы обсуждали ранее, выполните следующую команду
gcc --version
Установите GCC на Mac
Чтобы настроить среду программирования «C» в операционной системе MAC, выполните следующие действия:
1. Перейдите по указанной ссылке. https://developer.apple.com/downloads/index.action и скачать. Вам понадобится идентификатор разработчика Apple.
«Инструменты командной строки для X-Code», выберите любую версию (всегда рекомендуется последняя версия) и загрузите .dmg .
2. После загрузки файла на компьютер дважды щелкните его, следуйте указаниям мастера и установите файл. Всегда сохраняйте настройки по умолчанию, предложенные мастером установки.
3. После процесса установки откройте терминал и выполните команду gcc -v, чтобы проверить, все ли успешно установлено.
Заключение
«C’ Программа может быть написана и выполнена на любой машине, имеющей подходящую среду для запуска программы. Для запуска программ на языке C рекомендуется использовать IDE или компилятор C для Windows. IDE включает в себя компилятор, редактор и отладчик. Clanfg, компилятор MinGW (минималистская коллекция компиляторов GNU для Windows), портативный компилятор C, Turbo C — популярные доступные компиляторы.
- Динамическое распределение памяти в C с использованием функций malloc(), calloc()
- Приведение типов в C: преобразование типов, неявное, явное с примером
- Учебное пособие по программированию на C в формате PDF для начинающих
- 13 ЛУЧШИХ книг по программированию на C для начинающих (обновление 2023 г.)
- Функция calloc() в библиотеке C с ПРИМЕРОМ программы
