Почему я получаю синтаксическую ошибку, когда пытаюсь запустить мою программу на C ++ после ее компиляции?

Вот как я понимаю.

Вы говорите, что вы покидаете сеанс или закрываете текущий сеанс терминала.

Но вы используете tmux и все tmux для запуска программ в фоновом режиме.

Попробуйте запустить программу, поместив ее из фона. Я имею в виду

nohup myscript.sh &

nohup, чтобы запустить ваш скрипт, даже вы подписываетесь, &[and], чтобы подтолкнуть ваш сценарий к фону.

Надеюсь, это поможет вам.

-1
задан 14 April 2018 в 13:57

4 ответа

Вы неправильно вызываете компилятор. Вы также должны использовать расширение файла .cc или .cpp для файлов C ++. Правильное заклинание команды компилятора там было бы, например, g++ hello-world.cpp -o hello-world.

3
ответ дан 17 July 2018 в 16:54

Как объясняется в этом ответе Элиадж Каган, сообщения об ошибках, которые вы видели, произошли, потому что вы пытались выполнить свой исходный файл. Здесь я попытаюсь объяснить, почему вы получили эти конкретные сообщения.

Когда вы даете файлу выполнить этот ответ Eliah Kagan , а затем вы попытаетесь выполнить его, запустив /path/to/filename (что часто ./filename), и это текстовый файл, он будет запущен как скрипт. Сценарии обычно имеют строку shebang в качестве первой строки, состоящую из #!, за которой следует полный путь предполагаемого интерпретатора.

При попытке запустить исполняемый текстовый файл из оболочки Bash и файл не имеет строки shebang, Bash предполагает, что это скрипт оболочки и запускает новую оболочку Bash для ее запуска. (По-прежнему неплохо написать #!/bin/bash в верхней части сценария Bash, в случае, если оболочка, которая запускает его, не является Bash.) Но если файл содержит что-то иное, кроме кода Bash, тогда вы обычно получаете множество синтаксисов ошибки. Вот что случилось с вами, поскольку сообщения об ошибках, которые вы получили, указывают:

$ ./4 ./4: line 1: //myfirst: No such file or directory ./4: line 4: syntax error near unexpected token `(' ./4: line 4: `int main ()'

Когда оболочка пытается выполнить файл в качестве сценария оболочки, он запускает новую, не попытку выполнить это shell для интерпретации сценария. Таким образом, многие сценарии, которые могут выполняться, например, изменение каталога или определение переменных или функций, не будут иметь никакого эффекта на вызывающую оболочку. Мы можем проверить, как ведет себя неинтерактивная дочерняя оболочка, подобная той, которая пыталась запустить ваш исходный файл, отправив вход в bash с строкой shebang , например:

$ bash <<< 'echo Hello World!' Hello World!

Просто запуск команды в текущей оболочке будет производить такой же или похожий вывод в течение некоторого времени (например, в приведенном выше случае), но мы можем более точно воспроизвести ваши сообщения об ошибках. Например:

$ bash <<<'//myfirst C++ program' bash: line 1: //myfirst: No such file or directory

Я предположил, что строка 1 вашего исходного файла указана на основе ошибки. //, который запускает однострочный , имеет какой-либо эффект , не является комментарием в Bash. Если в первом слове команды есть /, Bash принимает это слово как путь. Если путь был к исполняемому файлу, файл будет выполнен. (Это именно то, что произошло, когда вы запустили ./4: файл, путь которого был ./4, был выполнен.) Если такого файла нет, тогда мы получим сообщение об ошибке.

// разрешает в корневой каталог /, и поскольку в вашей системе он не содержит файла с именем myfirst, вы получили это No such file or directory. Если бы он содержал соответствующий файл, у вас, вероятно, была бы другая ошибка:

$ bash <<< '/dev' bash: line 1: /dev: Is a directory # matches, but it's a directory $ bash <<< '/swapfile' bash: line 1: /swapfile: Permission denied # matches, but not executable

Другой стиль комментария, который вы могли использовать в программе на C ++, /* */, мог бы создать больше интересные или хаотичные результаты, так как /* // разрешает корневой каталог / всем не скрытым файлам в корневом каталоге, а */ будет расширяться до всех не скрытых файлов которые являются каталогами в текущем каталоге.

У вас не было ошибок в строке 2 или 3. Возможно, это было из-за того, что они были пустыми, или потому, что они содержали некоторый действительный код Bash (очень маловероятный), который производил нет вывода, или у них была строка, которая начиналась с #, что является комментарием в Bash. Например, у вас может быть строка типа:

#include <iostream>

Поскольку Bash запускает команды из файла, он предполагает, что все, начиная с неуказанного #, просто для людей и игнорирует его.

Затем в строке 4 вы получили синтаксическую ошибку:

$ bash <<< 'int main()' bash: line 1: syntax error near unexpected token `(' bash: line 1: `int main()'

( и ) являются оболочкой , начиная с неуказанного # . Они могут порождать подоболочку, в которой может выполняться команда или список команд. Обычно это интерпретатор , где вывод команды, запускаемой в подоболочке, заменяет ее во внешней оболочке. Это происходит, когда $ предшествует (stuff). Вот (полезный) пример:

$ which g++ /usr/bin/g++ $ readlink -e $(which g++) /usr/bin/x86_64-linux-gnu-g++-7

Двойные скобки вызывают subshell :

$ bash <<< 'echo $((3+4))' 7

Другое использование () означает, что предшествующее слово - это определяемая функция, как объясняется в ответах на вопрос: Каково использование круглых скобок `()` в определении функции оболочки? Если перед командой () есть два слова перед командой function, ( будет синтаксической ошибкой:

$ bash <<< 'foo bar()' bash: line 1: syntax error near unexpected token `(' bash: line 1: `foo bar()' $ bash <<< 'function bar()' bash: line 2: syntax error: unexpected end of file

function является необязательным, и мы получаем без него. Ошибка EOF, потому что мы еще не пошли . В чем заключаются скобки `()` в определении функции оболочки? .

Когда оболочка встречает синтаксическую ошибку, она будет прекратите обработку текущего ввода (и если это неинтерактивная оболочка, немедленно выйдите), чтобы вы не увидели никаких дальнейших ошибок независимо от того, что следует. Независимо от того, что ваш исходный файл продолжал говорить после int main(), оболочка не читала его.

Большое спасибо Элиа Кагану за то, что он побудил меня написать этот ответ и предоставить различные полезные сведения!

2
ответ дан 17 July 2018 в 16:54

Вы неправильно вызываете компилятор. Вы также должны использовать расширение файла .cc или .cpp для файлов C ++. Правильное заклинание команды компилятора там было бы, например, g++ hello-world.cpp -o hello-world.

3
ответ дан 23 July 2018 в 17:45
  • 1
    Я попробовал команду компилятора u, предложенную, это был результат gzuspower @ gzuspower: ~ / Desktop $ g ++ firstc ++. Cpp -o firstc ++ g ++: error: firstc ++. Cpp: Нет такого файла или каталога g ++: фатальная ошибка: компиляция входных файлов не завершена , Имя моего файла было firstc ++, когда я щелкнул его правой кнопкой мыши и перешел к свойствам вида, который указывает, что это исходный код C. – Steve Wooten 14 April 2018 в 13:03
  • 2
    @SteveWooten Измените свой вопрос . Вставьте полный текст каждой программы на C ++, которую вы пытались скомпилировать, и заполните текст с терминала: что вы ввели и вы получили, каждый раз, когда вы пытались скомпилировать и запустить его. (При необходимости, по крайней мере, воспроизведите проблему хотя бы один раз и предоставьте информацию из этого.) Хотя я уверен, что этот вопрос был неправильно закрыт, и что другой ответ уже возможен (если только он не получает ошибочно повторно закрыл , прежде чем кто-либо сможет опубликовать его), вполне вероятно, что никакой ответ не будет полностью удовлетворять вас, если вы не включите все соответствующие данные. – Eliah Kagan 14 April 2018 в 22:48

Как объясняется в этом ответе Элиадж Каган, сообщения об ошибках, которые вы видели, произошли, потому что вы пытались выполнить свой исходный файл. Здесь я попытаюсь объяснить, почему вы получили эти конкретные сообщения.

Когда вы даете файлу выполнить этот ответ Eliah Kagan , а затем вы попытаетесь выполнить его, запустив /path/to/filename (что часто ./filename), и это текстовый файл, он будет запускаться как скрипт. Сценарии обычно имеют строку shebang в качестве первой строки, состоящую из #!, за которой следует полный путь предполагаемого интерпретатора.

При попытке запустить исполняемый текстовый файл из оболочки Bash и файл не имеет строки shebang, Bash предполагает, что это скрипт оболочки и запускает новую оболочку Bash для ее запуска. (По-прежнему неплохо написать #!/bin/bash в верхней части сценария Bash, в случае, если оболочка, которая запускает его, не является Bash.) Но если файл содержит что-то иное, кроме кода Bash, тогда вы обычно получаете множество синтаксисов ошибки. Вот что случилось с вами, поскольку сообщения об ошибках, которые вы получили, указывают:

$ ./4 ./4: line 1: //myfirst: No such file or directory ./4: line 4: syntax error near unexpected token `(' ./4: line 4: `int main ()'

Когда оболочка пытается выполнить файл в качестве сценария оболочки, он запускает новую, не попытку выполнить это shell для интерпретации сценария. Таким образом, многие сценарии, которые могут выполняться, например, изменение каталога или определение переменных или функций, не будут иметь никакого эффекта на вызывающую оболочку. Мы можем проверить, как ведет себя неинтерактивная дочерняя оболочка, подобная той, которая пыталась запустить ваш исходный файл, отправив вход в bash с строкой shebang , например:

$ bash <<< 'echo Hello World!' Hello World!

Просто запуск команды в текущей оболочке будет производить такой же или похожий вывод в течение некоторого времени (например, в приведенном выше случае), но мы можем более точно воспроизвести ваши сообщения об ошибках. Например:

$ bash <<<'//myfirst C++ program' bash: line 1: //myfirst: No such file or directory

Я предположил, что строка 1 вашего исходного файла указана на основе ошибки. //, который запускает однострочный , имеет какой-либо эффект , не является комментарием в Bash. Если в первом слове команды есть /, Bash принимает это слово как путь. Если путь был к исполняемому файлу, файл будет выполнен. (Это именно то, что произошло, когда вы запустили ./4: файл, путь которого был ./4, был выполнен.) Если такого файла нет, тогда мы получим сообщение об ошибке.

// разрешает в корневой каталог /, и поскольку в вашей системе он не содержит файла с именем myfirst, вы получили это No such file or directory. Если бы он содержал соответствующий файл, у вас, вероятно, была бы другая ошибка:

$ bash <<< '/dev' bash: line 1: /dev: Is a directory # matches, but it's a directory $ bash <<< '/swapfile' bash: line 1: /swapfile: Permission denied # matches, but not executable

Другой стиль комментария, который вы могли использовать в программе на C ++, /* */, мог бы создать больше интересные или хаотичные результаты, так как /* // разрешает корневой каталог / всем не скрытым файлам в корневом каталоге, а */ будет расширяться до всех не скрытых файлов которые являются каталогами в текущем каталоге.

У вас не было ошибок в строке 2 или 3. Возможно, это было из-за того, что они были пустыми, или потому, что они содержали некоторый действительный код Bash (очень маловероятный), который производил нет вывода, или у них была строка, начавшаяся с #, которая является комментарием в Bash. Например, у вас может быть строка типа:

#include <iostream>

Поскольку Bash запускает команды из файла, он предполагает, что все, начиная с неуказанного #, просто для людей и игнорирует его.

Затем в строке 4 вы получили синтаксическую ошибку:

$ bash <<< 'int main()' bash: line 1: syntax error near unexpected token `(' bash: line 1: `int main()'

( и ) являются оболочкой , начиная с неуказанного # . Они могут порождать подоболочку, в которой может выполняться команда или список команд. Обычно это интерпретатор , где вывод команды, запускаемой в подоболочке, заменяет ее во внешней оболочке. Это происходит, когда $ предшествует (stuff). Вот (полезный) пример:

$ which g++ /usr/bin/g++ $ readlink -e $(which g++) /usr/bin/x86_64-linux-gnu-g++-7

Двойные скобки вызывают subshell :

$ bash <<< 'echo $((3+4))' 7

Другое использование () означает, что предшествующее слово - это определяемая функция, как объясняется в ответах на вопрос: Каково использование круглых скобок `()` в определении функции оболочки? Если перед командой () есть два слова перед командой function, ( будет синтаксической ошибкой:

$ bash <<< 'foo bar()' bash: line 1: syntax error near unexpected token `(' bash: line 1: `foo bar()' $ bash <<< 'function bar()' bash: line 2: syntax error: unexpected end of file

function является необязательным, и мы получаем без него. Ошибка EOF, потому что мы еще не пошли . В чем заключаются скобки `()` в определении функции оболочки? .

Когда оболочка встречает синтаксическую ошибку, она будет прекратите обработку текущего ввода (и если это неинтерактивная оболочка, немедленно выйдите), чтобы вы не увидели никаких дальнейших ошибок независимо от того, что следует. Независимо от того, что ваш исходный файл продолжал говорить после int main(), оболочка не читала его.

Большое спасибо Элиа Кагану за то, что он побудил меня написать этот ответ и предоставить различные полезные сведения!

2
ответ дан 23 July 2018 в 17:45

Другие вопросы по тегам:

Похожие вопросы: