【问题标题】:Compiling a .cpp file with c++ command instead of g++ (Linux)使用 c++ 命令而不是 g++ (Linux) 编译 .cpp 文件
【发布时间】:2021-12-12 07:16:35
【问题描述】:

假设我们有一个名为 hello.cpp 的简单 c++ 文件,它打印“Hello World!”。

我们通常使用g++ hello.cpp 创建可执行文件。当我尝试执行命令c++ hello.cpp 时,它成功创建了可执行文件。它不应该抛出一个错误,说没有可用的 c++ 命令吗?并建议我们使用 g++?

我尝试在终端上运行man c++,这会打开 GNU C 项目页面。那么,终端是否在内部将我们的c++ hello.cpp 替换为g++ hello.cpp?它不应该这样做吗?

其他信息:
同样,如果我有一个打印“Hello World!”的hello.c 程序。当我在命令行上执行c hello.c 时,我得到了错误:

$ c hello.c
c: command not found

这是意料之中的,因为我们必须使用gcc hello.c。为什么c++ hello.cpp 没有出现类似的错误?

【问题讨论】:

  • 为了方便起见,c++ 命令通常是指向g++ 的硬链接。 ccgcc 同样链接。
  • 那么,这是操作系统创建者通常会做的事情吗?而 GNU 项目与此没有任何联系?
  • 这要么是包创建者(他们制作你安装的包)的决定,要么可能是 GCC 项目本身作为构建应用程序的一部分。操作系统本身并不会真正了解这一点。

标签: c++ c gcc g++ gnu


【解决方案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++ --versionc++ --version 给出相同的输出并且都说它们是 g++。但是,cc 是那里的 gcc 的直接符号链接。

【讨论】:

    【解决方案2】:

    它不应该抛出一个错误,说没有可用的 c++ 命令吗?并建议我们使用 g++?

    Weeelll,没有规定或标准限制或要求c++ 命令执行任何操作,因此没有“应该”或“不应该”。但是,强烈期望c++ 是一个工作的 C++ 兼容编译器,它支持与cc 类似或相同的标志。

    终端是否在内部将我们的 c++ hello.cpp 替换为 g++ hello.cpp?

    终端是显示事物的设备。终端不替换它,对它没有影响。

    很可能是您的系统设计者,但也可能是管理员、发布者或分销商或包设计者(或链中的任何人),将您的系统配置为提供名为 c++ 的命令。通常,该命令是到工作 C++ 编译器的符号链接,通常是 Linux 系统上的 g++。在我的系统上,/usr/bin/c++ 程序只是安装了package named gcc,但有些系统允许它是configurable

    它不应该这样做吗?

    如上所述,终端不应该替换命令,它对它没有影响。

    这是预期的,因为

    这是预期的,因为没有名为 c 的命令。还有无穷无尽的其他未知命令。

    cc 是 C 编译器的旧名称。 c99 是 C99 兼容编译器的标准化名称。

    为什么 c++ hello.cpp 没有出现类似的错误?

    因为您的系统上存在一个名为 c++ 的命令。

    【讨论】:

    • C 成为编译C 代码 的另一件事是它是一个字母。不要过度描述(也不是 awk,请注意),但为了必须使用这些东西的穷人,我们需要摆脱单字母标识符。如果我因为使用​​ 1 个字母而在代码审查中批评别人,如果我不对 1 个字母的程序名称做同样的事情,我就是个伪君子。
    猜你喜欢
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2014-02-07
    • 1970-01-01
    相关资源
    最近更新 更多