cc为什么可以编译c ++程序?

时间:2019-10-20 16:25:38

标签: c++ gcc g++ clang++ cc

我有一个用于macOS和Linux的Makefile,其中包含以下命令:

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

它编译良好。顾名思义,foo.cppbar.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 ++ include中失败了?

系统上是否有cc的{​​{1}}对应项?如果我使用c++,我会假定该命令可用,并且如果用户实际上想使用他的首选编译器(如cc)进行编译怎么办?

编辑:g++$(CXX)的良好替代品吗?

1 个答案:

答案 0 :(得分:1)

系统上最可能的cc是指向gcc可执行文件的符号链接。假设是真的:

gccg++之间的差异(引用man page)是:

  

g ++是一个程序,该程序调用GCC并自动指定针对C ++库的链接。

因此,当您调用gcc时,它不会链接到c ++库。您可以手动链接标准c ++库:

gcc -lstdc++ 1.cpp
  

系统上是否有cc for c ++的对应版本?

cc命令只是大多数系统遵循的约定。它不是标准化的,至少我没有听说过posix使实用程序c99标准化。在装有gcc软件包的archlinux发行版的Linux系统上,还安装了/usr/bin/c++g++的符号链接。