【问题标题】:Why can cc compile a c++ program?为什么cc可以编译c++程序?
【发布时间】:2020-02-16 20:58:09
【问题描述】:

我有一个适用于 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++ 包含而失败?

系统上是否有cc 对应的c++?如果我使用g++,我会假设该命令可用,如果用户真的想用他喜欢的编译器(如cc)编译它怎么办?

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

【问题讨论】:

  • Clang 的命令是 clang++。
  • $(CXX) 看起来像构建脚本中的变量,而不是编译器的名称。您可能会在某个地方找到$(CXX)=cc 将编译器设置为cc,然后脚本的其余部分愉快地使用$(CXX) 并获取CXX 包含的任何内容。这样,无论有多少不同的规则使用编译器,您只需更改一次编译器。
  • 我有点困惑为什么当前提供的答案没有帮助。如果你只是用c++ 替换cc 会发生什么?例如编译/链接命令应该是c++ -std=c++14 foo.cpp bar.cpp .
  • @G.M.因为 c++ 并不在所有系统上
  • 好的,所以如果您需要可以保证在所有平台上工作的东西(或者如果不能,则失败),那么您可能应该接受@KamilCuk 的建议并使用cmake 之类的东西。话虽如此,在macos 和任何linux 框中,我使用过ccc++ 分别指的是默认的CC++ 编译器。

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


【解决方案1】:

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

引用man pagegccg++ 之间的区别是:

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

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

gcc -lstdc++ 1.cpp

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

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

【讨论】:

  • 如果您不想链接到 C++98 库 (-lstdc++),您也可以链接到 C++11 库 (-lc++)。
  • $ cc -lc++ 1.cpp /usr/bin/ld: cannot find -lc++。它不适用于我的archlinux。我只有/usr/lib/libstdc++.so
  • 不幸的是,这并没有解决问题。 -stdlib=libc++ 也无济于事
  • solve the problem - 有什么问题?你想检测c++编译器,向最好的学习。例如 cmake 试图找到 c++ g++ aCC cl bcc xlCclang++
  • @Eljay 我不认为-lc++ 与 C++11 支持有什么关系?可能是 Clang 对标准库(libc++)的实现。
猜你喜欢
  • 2019-11-27
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
相关资源
最近更新 更多