Почему cc может скомпилировать программу на c ++? - PullRequest
1 голос
/ 20 октября 2019

У меня есть make-файл для macOS и Linux, который содержит следующую команду:

cc -std=c++14 foo.cpp bar.cpp

И он прекрасно компилируется. foo.cpp и bar.cpp, как следует из названия, подразумевают файлы C ++ и содержат синтаксис C ++ 11. Компиляция работает отлично.

Теперь, если я включу <fstream>, я получу сотни ошибок компоновщика. Мне интересно, почему это так?

Undefined symbols for architecture x86_64:
"std::__1::locale::has_facet(std::__1::locale::id&) const", referenced from:
    bool std::__1::has_facet<std::__1::codecvt<char, char, __mbstate_t> >(std::__1::locale const&) in DiceInvaders-6f5dd4.o
"std::__1::locale::use_facet(std::__1::locale::id&) const", referenced from:
...

Afaik, cc ссылки на компилятор c, и я предполагаю, что из-за его автоматического определения он компилирует его с компилятором C ++. Но почему происходит сбой с дополнительным включением C ++?

Есть ли в системе аналог cc для c++? Если я использую g++, я бы предположил, что команда доступна, и что, если пользователь на самом деле хотел скомпилировать ее со своим предпочтительным компилятором (как в cc)?

Редактировать: $(CXX) хорошозамена для cc?

1 Ответ

1 голос
/ 20 октября 2019

Скорее всего cc в вашей системе является символической ссылкой на исполняемый файл gcc. Предполагая, что это правда:

Разница между gcc и g++, цитирующая man-страницу , такова:

g ++ - это программа, которая вызываетGCC и автоматически указывает связь с библиотекой C ++.

Поэтому, когда вы вызываете gcc, она не связывается с библиотекой c ++. Вы можете вручную связать стандартную библиотеку c ++:

gcc -lstdc++ 1.cpp

Есть ли в системе какой-либо аналог cc для c ++?

Команда cc - это просто соглашениеэта самая система следует. Это не стандартизировано, по крайней мере, я не слышал, где утилита c99 стандартизирована posix . В моей системе Linux с дистрибутивом archlinux с пакетом gcc также установлена ​​символическая ссылка /usr/bin/c++ на g++.

...