Ste*_*ten -1 command-line c++ g++
我正在尝试学习 C++,但我什至无法使 cplusplus.org 中的第一个(hello world)示例与g++
命令或c++
. 我像示例一样创建了一个文件并运行g++ myfile
,然后./myfile
.
我遇到权限问题,然后我使用chmod +x myfile
,权限问题消失了,但发生了这个问题:
gzuspower@gzuspower:~/Desktop$ ./4
./4: line 1: //myfirst: No such file or directory
./4: line 4: syntax error near unexpected token `('
./4: line 4: `int main ()'
Run Code Online (Sandbox Code Playgroud)
我打电话给我的文件,4
因为这是我的第四次尝试。这是在Xubuntu 16.04上。重复的问题答案不起作用我试过.c,.cpp,作为文件扩展名并尝试了firstc++(我的第一次尝试文件)而不是4(我的第四次尝试文件),但没有任何效果。我将尝试不同形式的 hello-world 代码。
chmod
在您认为编译器生成的文件上运行很少有用。当编译器生成一个要执行的二进制文件时——也就是说,当它生成你的程序时——它会自动将其标记为可执行。如果您能够成功地将文件标记为可执行文件,chmod +x
那么您的编译器将能够做同样的事情。如果您尝试运行您认为是由您的编译器生成的程序,并且您收到有关权限的错误,这通常意味着您正在运行错误的文件。
在这种情况下,特定的错误消息表明您正在尝试运行自己的 C++ 源代码文件。那永远行不通。您需要运行编译器生成的文件,这是一个单独的文件。对于大多数编译器(包括 )g++
,a.out
除非您通过将命令行参数作为命令行参数传递给编译器来传递不同的输出文件名,否则将调用此文件。你通常应该这样做。-o filename
此外,如果您的 C++ 源代码文件没有以.cpp
, .cxx
, .cc
, 或结尾的名称命名.C
,那么它应该是。此外,这是区分大小写的。以 结尾的文件.c
表示C源代码,而不是 C++,即使您运行 C++ 特定的编译器命令,如g++
,它也会被视为 C。大多数 C++ 编译器——包括g++
几乎所有其他在 Ubuntu 上运行的编译器——将检查输入文件的后缀以找出如何处理它们。有多种方法可以明确告诉编译器您的源代码是用什么语言编写的,但与以传统方式简单地命名源代码文件相比,它们很麻烦。
您已经在文本编辑器中编写(或粘贴)了一些 C++ 代码并将其保存在一个文件中。首先确保您已导航到该文件所在的目录。在终端中,您可以使用cd
命令更改目录。当您打开终端窗口时,您通常位于主目录中。假设您的源代码文件名为hello.cpp
. 然后运行像这样的命令g++ -o hello hello.cpp
只有在hello.cpp
实际位于您的主目录中时才会成功。如果是,例如,在您的桌面上,则首先运行:
cd ~/Desktop
Run Code Online (Sandbox Code Playgroud)
(该~/
部分代表您的主目录。如果您已经在终端中,那么您不需要包含该部分。但我已经包含了它,因为Desktop
无论在哪里,该命令都会让您进入主目录的子目录你已经是了。)
再举一个例子,如果你在桌面上有一个目录被调用,source
并且你已经将源代码文件保存在该目录中,那么你可以通过运行在终端中到达那里:
cd ~/Desktop/source
Run Code Online (Sandbox Code Playgroud)
如果您的文件浏览器中有您要访问的目录的文件夹图标,那么您可以通过键入cd
、键入Space并将该图标拖到终端窗口中来到达那里。这会将其完整路径名复制到终端中,您可以按Enter。
一旦您cd
访问了源代码文件所在的任何位置,请检查它。例如,您可以运行此命令以列出当前位置中的所有文件(名称以 开头的文件除外.
,您可能不想看到这些文件):
ls -l
Run Code Online (Sandbox Code Playgroud)
或者您可以将源代码文件的文件名传递给ls
. 例如,如果它被调用hello.cpp
,那么你可以运行:
ls -l hello.cpp
Run Code Online (Sandbox Code Playgroud)
如果在执行此操作时看到此错误,则表示当前目录中没有该名称的文件:
ls: cannot access 'hello.cpp': No such file or directory
Run Code Online (Sandbox Code Playgroud)
因此,如果您看到这样的错误消息,那么无论如何都不要尝试使用g++
orc++
命令编译您的程序,因为它不起作用,因为您不在正确的位置。
一旦你知道你在正确的地方,试着编译你的源代码文件,看看编译器是否报告了任何它调用的错误。成功编译并运行第一个程序后,您也应该开始注意编译器警告,因为它们通常会告诉您有关代码问题的宝贵信息。它们还可以帮助解释错误。但是,了解错误和警告之间的区别很重要。尽管标准化 C++ 的文档中没有一个真正讨论过错误或警告本身(他们讨论的是“诊断”),但这种区别非常重要。错误是编译器告诉您它无法编译您的程序。
以下是您可能会看到的编译错误示例:
hello.cpp:55:84: error: expected primary-expression before ‘<<’ token
Run Code Online (Sandbox Code Playgroud)
请注意,编译器包含error:
在消息中。寻找那个。您可能会遇到许多不同类型的错误,具体取决于您的源代码和您使用编译器的方式。他们不会都看起来很像。但他们通常会说error:
。
如果您尝试编译您的程序,但编译器产生了一些它称之为错误的东西,而您忽略了这一点并尝试运行您的程序,那么存在三种可能性,但它们都不是您想要的。您可能正在运行编译器未生成的内容。这发生在你身上:你试图运行你的源代码文件本身。或者您可能试图运行一个甚至不存在的文件。或者,您可能正在运行您的编译器先前在成功的早期编译期间生成的内容,因此运行的程序版本比您打算运行的版本旧。
考虑到这一点,您可以尝试通过运行如下命令来编译您的程序:
g++ -o hello hello.cpp
Run Code Online (Sandbox Code Playgroud)
我说,你会运行一个命令像一个因为你需要改变hello.cpp
你的C ++源代码文件的实际名称。您可能还想将hello
后面出现的更改为-o
其他文件名。该文件名是编译器在成功时(即如果没有错误)将生成的程序。您可能不想调用所有程序hello
。如果当前目录中已经有一个名为 的文件hello
,或者您在 之后放置的任何内容而不是它-o
,那么编译器将覆盖该文件。
如果有错误,那么是时候尝试找出问题所在了。可能是源代码有错误。也许你在编译它时犯了一个错误。也许它需要更多的选项传递给编译器。有很多事情可能会出错,虽然大多数时候您可能能够弄清楚,但您有时可能——甚至可能经常——需要寻求帮助,这很好。当您确实寻求帮助时,您应该始终确保提供产生问题的小程序的完整源代码,并完整描述您所做的一切和发生的事情,包括显示您运行的所有命令及其输出。
假设你-o hello
如上图传递给编译器,编译成功。然后您将尝试使用以下命令运行您的程序:
./hello
Run Code Online (Sandbox Code Playgroud)
如果您看到这样的错误,则表示未找到您的程序:
bash: ./hello: No such file or directory
Run Code Online (Sandbox Code Playgroud)
因此,如果发生这种情况,请回顾编译器的输出。检查是否有您遗漏的错误。同样,如果您看到这样的错误,则表示您尝试运行的文件确实存在,但实际上无法运行。此问题有多种可能的原因,但通常意味着您正在尝试运行错误的文件:
bash: ./hello: Permission denied
Run Code Online (Sandbox Code Playgroud)
之前,我描述了使用ls -l
查看当前目录中的文件,或检查特定文件的方法。上下文正在检查您是否处于开始尝试编译程序的正确位置。但是在您编译程序之后,如果您无法运行它并且您不确定原因,那么该ls
命令是您可以用来查看编译器是否真的创建过该文件的工具之一。
运行ls -l
(或者可能只是ls
)的一件事有时可以帮助您发现,如果您输入错误名称,并且意外地在-o
(编译程序时)之后编写了与./
尝试运行程序时编写的不同的内容。
./
in的目的./hello
是告诉您的 shell 您要运行hello
位于当前目录中的名为的文件。.
代表当前目录。如果您只是编写hello
并按Enter,而没有前导./
,那么 shell 将尝试查找并运行hello
已安装的名为该命令的命令。这不是你想要的,在这里。您想要运行您刚刚编译并驻留在当前目录中的特定文件。
最后,假设您尝试运行您的程序并且您看到包含其源代码片段的消息,如下所示,您确实看到了:
./4: line 1: //myfirst: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我什至没有看到你的源代码,但我可以看出这看起来包含它的一个片段。具体来说,//myfirst
看起来像是您可能已放置在源代码顶部的单行注释的开头。尽管尝试运行程序时可能会出现显示包含源代码文件中文本的消息的问题,但这种情况很少见。更常见的是您不小心尝试运行源代码文件而不是编译器生成的二进制文件!因此,如果您在运行C++ 程序时看到错误消息,这些消息看起来像是在提及您的源代码片段,总是检查。并且当您尝试运行 C++ 程序时,请始终运行编译器生成的文件,该文件与您自己编写的源代码文件不同。
可以(现在已经)写出完整的答案,说明您看到这些特定消息的确切原因。但是,基本上,发生的事情是您曾经chmod
使源代码文件可执行,然后当您运行它时,它作为shell 脚本运行。代码//myfirst
被解释为 shell(bash
在本例中为 )而不是 C++ 中的代码,它告诉 shell 尝试运行目录中名为 mymyfirst
的/
文件。没有这样的文件,所以你得到了一个错误。
不过,更一般地说,我建议记住: