这是我的代码 - 不知道为什么我收到此错误消息:
$ ./main.cpp "hello" "is"
./main.cpp: line 4: syntax error near unexpected token `('
./main.cpp: line 4: `int main(int argc, char *argv[]){'
它在g ++中编译很好,但是当我运行它时,我得到了上面的错误。知道为什么吗?这是我的完整代码..
#include <iostream>
#include <fstream>
int main(int argc, char *argv[]){
for(int i = 0; i < argc; i++){
std::cout << argc << " : " << argv[i] << '\n';
}
if (argc != 2){
std::cout << "\nUSAGE: 2 command line arguments please." << std::endl;
std::cout << "\n (1) Input file with raw event scores.\n (2) Output file to write into.";
}
// open the font file for reading
std::string in_file = argv[1];
std::ifstream istr(in_file.c_str());
if (!istr) {
std::cerr << "ERROR: Cannot open input file " << in_file << std::endl;
}
return 0;
}
答案 0 :(得分:3)
您必须运行已编译的程序,而不是源代码:
$ g++ -o main main.cpp
$ ./main "hello" "is"
3 : ./main
3 : hello
3 : is
USAGE: 2 command line arguments please.
(1) Input file with raw event scores.
(2) Output file to write into.ERROR: Cannot open input file hello
您的示例是尝试将C ++代码作为shell脚本执行,但这不起作用。正如您从我的程序测试运行输出中可以看到的那样,您仍然会遇到一些问题。
答案 1 :(得分:2)
正如其他答案所说,您将其作为shell脚本运行,隐式使用/bin/sh
。
以#
开头的前两行被shell视为注释。第三行是空白的,什么都不做。第四行被解释为命令int
,但括号对于shell是特殊的,并且在这里没有正确使用。 int
中可能没有$PATH
命令,但shell没有机会报告,因为它会因语法错误而窒息。
这些细节都不是特别重要;问题是你正在执行程序错误。但是,为什么要打印这些特定的错误消息可能会很有趣。
看起来你已经完成了像chmod +x main.cpp
这样的事情。否则shell将首先拒绝尝试执行它。使C ++源文件可执行不会造成任何真正的伤害(只要它是可读写的),但它没有任何用处,并且正如您所看到的那样延迟了对错误的检测。如果您执行chmod -x main.cpp
,然后再次尝试./main.cpp
,则会收到“权限被拒绝”错误。
正如Carl的回答所说,您需要执行编译器生成的可执行文件,而不是C ++源文件。这就是编译器的原因。编译器(实际上是链接器)将自动在它生成的可执行文件上执行等效的chmod +x
。
file
命令会告诉你什么类型的文件,这会影响你可以用它做什么。例如,在运行g++ main.cpp -o main
:
$ file main.cpp
main.cpp: ASCII C program text
$ file main
main: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xacee0dfd9ded7aacefd679947e106b500c2cf75b, not stripped
$
(file
命令应该将main.cpp
识别为C ++而不是C,但有时它会猜错。)
“ELF”是我的系统使用的可执行格式;该文件包含可执行的机器代码以及一些其他信息。系统上预安装的命令使用相同的格式。
您的系统的详细信息可能有所不同 - 并且在非Windows类系统(如MS Windows)上会有很大差异。例如,在Windows上,可执行文件通常以.exe
扩展名命名。
答案 2 :(得分:0)
默认情况下,编译器会创建一个名为“a.out”的可执行文件,因此您需要执行以下操作:
$ a.out“你好”“是”
键入“./main.cpp”正在尝试执行C ++源文件,可能是作为shell脚本