Могу ли я вызвать программу .cpp в Bash?

Я новичок в программировании на Bash. Я хочу вызвать мою программу на C ++ в файле Bash.

Моя программа myProg.cpp:

#include<iostream>
using namespace std;
int main()
{
   cout<<"Salam! World"<<endl;
return 0;
}

И мой файл bash myBash.sh. Как я могу вызвать вышеупомянутую программу .cpp в файле myBash.sh?

5
задан 18 April 2015 в 02:31

3 ответа

Необходимо скомпилировать его сначала: сначала измените текущий рабочий каталог Терминала к пути Вашего исходного файла:

cd <path_to_cpp_file>/

Тогда компилируют исходный файл:

g++ myProg.cpp -o myProg

Тогда можно назвать скомпилированный исполняемый файл от Вашего bash сценарий как это:

#!/bin/bash

# ...
<path_to_compiled_executable>/myProg
# ...
9
ответ дан 18 April 2015 в 02:31

Вот пример: от myBash.sh

#!/bin/sh
g++ myProg.cpp -o myProg
./myProg
0
ответ дан 18 April 2015 в 02:31

Так как Ваша реальная цель, кажется, для автоматизации безотносительно потребностей, которые будут сделаны для запущения программы, я предлагаю другой подход. Вместо того, чтобы писать сценарий оболочки, можно использовать make-файл. Если Вам нравится, можно записать правило в make-файле для выполнения исполняемого файла, после того как это создается. У Вас затем будет два файла - Ваш файл исходного кода C++ и Ваш make-файл - и Вы сможете выполнить единственную команду что эффективно:

  1. Сборки или восстанавливают Вашу программу C++, если и только если необходимый.
  2. Запускает Вашу программу.

Последующие разделы этого сообщения объясняют, почему Вы не можете назвать a .cpp зарегистрируйте непосредственно (но должен создать исполняемый файл из него сначала); как установить make, как использовать его, и что это делает негласно; и как избежать распространенных ошибок. Но в случае, если Вы хотите получить чувство того, на что этот подход похож прежде, чем пахать в, Вы будете работать make run после вставления this0 Makefile:

all: myProg

run: all
    ./myProg

Мне нравится этот лучше с этой целью, чем сценарий оболочки, и я думаю, что Вы могли бы, также.

Фон

В отличие от некоторых интерпретируемых языков как Python и Bash, C++ является скомпилированным языком 1, Программы, записанные в C++, должны быть созданы, прежде чем они будут выполнены. (Здание также иногда называют, компилируя, хотя компиляция более правильно относится к одному из шагов здания.) Вы не можете выполнить файл исходного кода C++; это должно вместо этого быть скомпилировано в объект code2 на этом машинном языке случая. Объектные файлы должны затем быть соединены, и даже если существует только один, это должно все еще быть связано с любыми общими библиотеками, которыми это пользуется. Соединение производит исполняемый файл, который может быть выполнен.

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

Получение make

Вы можете уже иметь make команда установлена; попытайтесь выполнить его для обнаружения. Если это будет установлено, то Вы будете видеть что-то как:

$ make
make: *** No targets specified and no makefile found.  Stop.

Для получения делают, можно установить сделатьInstall makeпакет , но я предлагаю установить существенный для сборки Install build-essential, который обеспечивает много других удобных инструментов. (Вы, возможно, установили существенный для сборки Install build-essential для получения g++, который является одним путем, Вы могли бы уже иметь make.) Можно использовать Центр программного обеспечения, чтобы установить его или выполнить команду:

sudo apt-get update && sudo apt-get install build-essential

make Без make-файла

Видеть как make работы, я предлагаю выполнить его без make-файла сначала, передавая его базовое имя Вашего файла исходного кода:

$ make myProg
g++     myProg.cpp   -o myProg
$ ./myProg
Salam! World

На последующих выполнениях, make сравнивает метки времени модификации (mtimes) на входных и выходных файлах и не восстановит Вашу программу излишне:

$ make myProg
make: 'myProg' is up to date.

Когда Вы изменяетесь myProg.cpp, это обновляет его метку времени модификации, таким образом, make будет знать для восстановления его. (Можно также обновить метку времени файла с touch команда, если Вы нуждаетесь или хотите вынудить какие-либо выходные файлы в зависимости от него быть восстановленными. И конечно, удаление выходных файлов также гарантирует, чтобы они были восстановлены, когда Вы работаете make- просто не удаляйте неправильный файл!)

$ touch myProg.cpp
$ make myProg
g++     myProg.cpp   -o myProg

Как делает make знайте, что сделать, когда Вы работаете make myProg?

  • myProg аргумент make назван целью.
  • Цели часто, но не всегда, названия файлов, которые будут созданы. Цели могут быть определены явно в make-файле.
  • Когда цель не определяется в make-файле или (как в этом случае) нет никакого make-файла, make ищет вход (т.е. исходный код) файлы, названные таким способом как, чтобы предположить, что они предназначаются для создания цели.
  • make выводит что утилита и синтаксис для использования в создании файла от его суффикса (в этом случае, .cpp).

Все это может быть настроено, но в простых случаях как это часто не должен быть.

Создание make-файла для автоматизации создания и запущения программы

Для автоматизации более сложных задач, чем создание программы из единственного файла исходного кода, такой, как будто существует несколько входных файлов или (более применимо к неотложным потребностям) действия, которых Вы желаете сделанный помимо выполнения компилятора, можно создать make-файл для определения целей для make и укажите, как они зависят от других целей.

Первая цель, определенная в make-файле, является целью по умолчанию: это что make попытки создать, когда выполнено без параметров командной строки (т.е. когда Вы работаете просто make, и не что-то как make myProg).

Обычный способ использовать make-файлы состоит в том, чтобы создать каталог, содержащий все файлы исходного кода (и любые другие файлы) раньше создавал Вашу программу, а также make-файл, который обычно называют Makefile. Тем именем, make автоматически найдет его.

Для создания make-файла, можно использовать для выполненного myProg и это автоматически создаст его сначала при необходимости, поместить myProg.cpp в новом, в других отношениях пустом каталоге. Создайте другой текстовый файл в том названном каталоге Makefile.

Можно использовать любой текстовый редактор для этого, но рецепт для правила - команды, перечисленные под нею, который будет выполнен для создания его цели - должны, должен быть расположен с отступом с вкладками, а не пробелами 3 Поэтому, если текстовый редактор в настоящее время настраивается для расположения с отступом с пробелами при нажатии Tab необходимо изменить это.

Например, в Gedit или Pluma, Вы вошли бы в Редактирование> Предпочтения, нажать вкладку Editor, и удостоверяться Вставляют пробелы вместо вкладок, неконтролируем:

Screenshot showing the Preferences dialog box in Pluma--whose interface is essentially the same as in Gedit--indicating the location of the Insert spaces instead of tabs checkbox near the top of the Editor tab

Много значений по умолчанию редакторов к расположению с отступом с вкладками и не пробелами, поэтому если Вы не изменили эти настройки прежде, они могут уже быть установлены правильно для make-файлов.

После того как Вы находитесь в своем редакторе и (при необходимости) настроили его, чтобы сделать отступ с вкладками, вставить это:

all: myProg

run: all
    ./myProg

Если Вы скопируете и вставите это, то это будет неправильно, потому что с пробелами справятся в том, даже при том, что Ваш текстовый редактор не делает их при нажатии Tab. (Это имеет отношение к пути, Спрашивает код дисплеев Ubuntu.), Но можно просто удалить четыре предыдущие пробелов ./myProg и нажмите Tab для создания вкладки в их месте.

Некоторое значение по умолчанию текстовых редакторов к показыванию вкладки как 8 пробелов или некоторое другое число. Это прекрасно.

Что тот make-файл делает, и как использовать его

Используйте команду:

  • make, для создания программы, если это уже не создается и исполняемый файл является текущим к исходному коду. Или,
  • make run, запускать программу, создавая его сначала при необходимости (т.е. если нет никакого текущего исполняемого файла).

Этот make-файл определяет две цели: all и run.

  • all цель не имеет никакого собственного рецепта, но зависит от myProg цель. Эта цель явно не определяется, таким образом, она неявно говорит make делать попытку здания myProg из любых файлов исходного кода доступны для него в текущем каталоге. (См. make Без раздела Makefile выше для деталей.)

    Поскольку all первая цель, явно определенная в Makefile, это будет создано когда make выполняется из каталога в который Makefile находится. Таким образом мы настроили вещи, настолько рабочие make отдельно эквивалентно выполнению make all.

  • run цель запускает программу. Его рецепт состоит из команды, которая делает так, ./myProg. run объявляет all будьте нацелены как зависимость. Это делает его так, чтобы, когда Вы работаете make run, myProg восстановлен если ток myProg исполняемый файл не является текущим (или еще не существует).

    Мы, возможно, точно также сделали run зависьте от myProg вместо на all, но нам все еще было бы нужно явное all цель (или эквивалентная цель другого имени) для предотвращения run от того, чтобы быть целью по умолчанию. Конечно, если Вы хотите свою программу, созданную и запущенную, даже когда Вы работаете make отдельно, Вы могли сделать это.

    Другое преимущество в зависимости от all цель - то, в случае, если позже существует больше мер, которые должны быть приняты, прежде чем Ваша программа должна быть запущена. Вы могли затем добавить рецепт к правилу для all.

Используя make-файл для запущения программы похож на это, если это должно быть создано:

$ cd myProg/
$ make run
g++     myProg.cpp   -o myProg
./myProg
Salam! World

Или это, если это не должно быть создано:

$ make run
./myProg
Salam! World

И если Вы просто хотите удостовериться, что программа создается (так как файл исходного кода был в последний раз изменен), не запуская программу, просто работайте make без аргументов:

$ make      # Here, I run make and myProg isn't current.
g++     myProg.cpp   -o myProg
$ make      # Running "make" again after "make" or "make run" does nothing.
make: Nothing to be done for 'all'.

(make myProg будет все еще работать, также.)

Улучшение: пользовательские флаги компилятора

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

Но это произошло со мной, Вы могли бы хотеть видеть предупреждения из компилятора, когда что-то не препятствует тому, чтобы сборка завершилась, но все еще является потенциальной ошибкой. Они не поймают все ошибки в программах, которые Вы пишете, но они могут поймать многих.

При использовании GCC (как с g++ команда), я рекомендую передать, по крайней мере, -Wall к компилятору. Это на самом деле не включает все предупреждения, но можно включить большинству из остальных с -Wextra. Можно иногда также хотеть -pedantic. (См. man gcc и 3.8 Опции Запросить или Отключить предупреждения в справочнике GCC.)

Вызвать g++ вручную с этими флагами, Вы работали:

g++ -Wall -Wextra -pedantic -o myProg myProg.cpp

Сделать make вызовите компилятор C++ (g++) с -Wall, -Wextra, и -pedantic флаги, добавляют a CXXFLAGS= строка с ними к вершине Makefile.

CXXFLAGS=-Wall -Wextra -pedantic

all: myProg

run: all
    ./myProg

Даже при том, что myProg все еще существует и является более новым, чем myProg.cpp, выполнение make или make run после редактирования Makefile все еще создаст программу снова, потому что Makefile является теперь более новым, чем myProg. Это - хорошая вещь, потому что:

  • В этом случае восстановление исполняемого файла заставляет Вас видеть предупреждения, если существует кто-либо (не должно быть для той конкретной программы).
  • В более общем плане иногда при редактировании make-файла, это - потому что Вы хотите, чтобы различные файлы были произведены или были произведены с различным содержанием. (Например, если Вы добавили -O3 флаг для тяжелой оптимизации или -g заставить компилятор генерировать отладочные символы, получающееся myProg исполняемый файл отличался бы.)

Дальнейшее чтение

Примечания

0: Я рекомендую читать далее, чтобы видеть, как сделать эту работу. Но в случае, если Вы хотите делать попытку его сначала сами: необходимо расположить строки с отступом с вкладками, а не пробелами.

1: Строго говоря фактически любой язык программирования мог быть или интерпретирован или скомпилирован в зависимости от того, какие реализации для него были записаны. Для некоторых языков существуют и интерпретаторы и компиляторы. Однако интерпретируемый C++ является редким - хотя не неслыханный.

2: Деление, встраивающее в компиляцию и соединение и вызов перевода файла исходного кода C++ (.cc/.cpp/.cxx/.C) в компиляцию объектного кода, не является целой историей. Программы в C и C++ (и некоторые другие языки) сначала предварительно обрабатываются. В Вашей программе, заменах препроцессора C #include<iostream> с содержанием <iostream> заголовочный файл перед фактической компиляцией запускается. И в самом узком смысле компиляция преобразовывает исходный код в ассемблер, а не объектный код. Много компиляторов (как GCC/g++) может объединить компиляцию и блок в одноэтапном, и не производят ассемблерный код, если не спросили сделать так.

В то время как предварительная обработка является отдельным шагом, GCC и другие компиляторы автоматически выполняют препроцессор. Точно так же они могут автоматически выполнить компоновщика, который является, почему всю последовательность предварительной обработки, компиляции, блока и связи иногда называют, "компилируя" вместо "здания". (Обратите внимание также, что здание может содержать больше, чем те шаги - например, оно может включить генерирующиеся файлы ресурсов, запущение скрипта, чтобы настроить, как вещи будут созданы, и т.д.),

3: Только необходимо сделать отступ с вкладками в самом make-файле. Используя make-файл не налагает требований к способу, которым Вы пишете свои файлы исходного кода C++ сами. Не стесняйтесь переключать добавление отступа назад от вкладок до пробелов, когда Вы будете работать над другими файлами. (И если Вам действительно не нравится делать отступ с вкладками в make-файле, можно установить .RECIPEPREFIX специальная переменная.)

5
ответ дан 23 November 2019 в 08:43

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

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