Компиляция cpp-файла с помощью команды c вместо g (Linux)

#c #c #gcc #g #gnu

Вопрос:

Допустим, у нас есть простой файл на c с именем hello.cpp , который печатает «Hello World!».

Обычно мы создаем исполняемый файл с помощью g hello.cpp . Когда я попытался выполнить команду c hello.cpp , она успешно создала исполняемый файл. Разве это не должно выдавать ошибку, в которой говорится, что команда c недоступна? и предлагаете нам использовать g ?

Я попытался запустить man c терминал, при этом открывается страница проекта GNU C. Итак, заменяет ли терминал наш c hello.cpp на g hello.cpp внутренний? Это не должно делать это правильно?

Дополнительная информация:
Аналогично, если у меня есть hello.c программа, которая печатает «Привет, мир!». При выполнении c hello.c в командной строке я получаю сообщение об ошибке:

 $ c hello.c
c: command not found
 

Это ожидаемо, поскольку мы должны использовать gcc hello.c . Почему я не получаю аналогичную ошибку для c hello.cpp ?

Комментарии:

1. Обычно c команда является жесткой ссылкой g только для этого удобства. cc и gcc также связаны.

2. Итак, это то, что обычно делают создатели операционных систем? И проект GNU не имеет к этому никакого отношения?

3. Это либо решение создателей пакета (которые создают пакет, который вы устанавливаете), либо, возможно, самого проекта GCC в рамках создания приложения. Сама операционная система на самом деле ничего не знала бы об этом специально.

Ответ №1:

В моей системе Ubuntu я вижу это:

 $ ls -l /usr/bin/c  
lrwxrwxrwx 1 root root 21 May  6  2019 /usr/bin/c   -> /etc/alternatives/c  
$ ls -l /etc/alternatives/c  
lrwxrwxrwx 1 root root 12 May  6  2019 /etc/alternatives/c   -> /usr/bin/g  
 

Таким образом, c на самом деле является псевдонимом (символической ссылкой) для g

Система альтернатив позволяет изменять, какой псевдоним компилятора c является псевдонимом:

 $ update-alternatives --display c  
c   - auto mode
  link best version is /usr/bin/g  
  link currently points to /usr/bin/g  
  link c   is /usr/bin/c  
  slave c  .1.gz is /usr/share/man/man1/c  .1.gz
/usr/bin/clang   - priority 10
/usr/bin/g   - priority 20
  slave c  .1.gz: /usr/share/man/man1/g  .1.gz
 

Таким образом, c на самом деле может быть либо g , либо clang

Для компилятора C вам не нужна c команда, но cc , опять же, это может быть либо gcc, либо clang.

Моя система CentOS не так очевидна с символическими ссылками, но g --version и c --version выдает один и тот же результат, и оба говорят, что они g . Однако cc является прямой символической ссылкой на gcc.

Ответ №2:

Разве это не должно выдавать ошибку, в которой говорится, что команда c недоступна? и предлагаете нам использовать g ?

Короче говоря, нет никаких правил или стандартов, которые ограничивали бы или требовали c от команды что-либо делать, поэтому нет никаких «должен» или «не должен». Однако было бы весьма ожидаемо, что c это работающий компилятор, совместимый с C , который поддерживает аналогичные или те же флаги, cc что и does.

заменяет ли терминал наш c hello.cpp с помощью g hello.cpp внутренне?

Терминал — это устройство, которое отображает информацию. Терминал не заменяет его, он не влияет на него.

Скорее всего, ваш системный разработчик, но, возможно, администратор, издатель, дистрибьютор или разработчик пакетов (или кто-либо в цепочке) настроил вашу систему на предоставление команды с именем c . Обычно эта команда представляет собой символическую ссылку на работающий компилятор C , обычно g в системах Linux. В моей системе /usr/bin/c программа просто устанавливается с именем пакета gcc , но некоторые системы позволяют ее настраивать.

Это не должно делать это правильно?

Как указано выше, терминал не должен заменять команды, это никак на него не влияет.

Это ожидается, поскольку

Это ожидаемо, поскольку команда не названа c . Существует бесконечное количество других неизвестных команд.

cc это старое доброе название компилятора C. c99 это стандартное имя компилятора, совместимого с C99.

Почему я не получаю аналогичную ошибку для c hello.cpp ?

Потому c что в вашей системе существует команда с именем.

Комментарии:

1. Еще одна вещь, связанная с тем, что C компилирует код C , — это одна буква. Не слишком описательный (как и awk, заметьте), но ради бедных людей, которым приходится использовать этот материал, нам нужно уйти от однобуквенных идентификаторов. Если я обманываю людей в обзорах кода за использование 1 буквы, я был бы лицемером, если бы не сделал то же самое с именем программы из 1 буквы.