Я новичок в программировании на Bash. Я хочу вызвать мою программу на C ++ в файле Bash.
Моя программа myProg.cpp
:
#include<iostream>
using namespace std;
int main()
{
cout<<"Salam! World"<<endl;
return 0;
}
И мой файл bash myBash.sh
. Как я могу вызвать вышеупомянутую программу .cpp в файле myBash.sh
?
Необходимо скомпилировать его сначала: сначала измените текущий рабочий каталог Терминала к пути Вашего исходного файла:
cd <path_to_cpp_file>/
Тогда компилируют исходный файл:
g++ myProg.cpp -o myProg
Тогда можно назвать скомпилированный исполняемый файл от Вашего bash
сценарий как это:
#!/bin/bash
# ...
<path_to_compiled_executable>/myProg
# ...
Вот пример: от myBash.sh
#!/bin/sh
g++ myProg.cpp -o myProg
./myProg
Так как Ваша реальная цель, кажется, для автоматизации безотносительно потребностей, которые будут сделаны для запущения программы, я предлагаю другой подход. Вместо того, чтобы писать сценарий оболочки, можно использовать make-файл. Если Вам нравится, можно записать правило в make-файле для выполнения исполняемого файла, после того как это создается. У Вас затем будет два файла - Ваш файл исходного кода C++ и Ваш make-файл - и Вы сможете выполнить единственную команду что эффективно:
Последующие разделы этого сообщения объясняют, почему Вы не можете назвать 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.
Для получения делают, можно установить сделатьпакет , но я предлагаю установить существенный для сборки , который обеспечивает много других удобных инструментов. (Вы, возможно, установили существенный для сборки для получения 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
выводит что утилита и синтаксис для использования в создании файла от его суффикса (в этом случае, .cpp
).Все это может быть настроено, но в простых случаях как это часто не должен быть.
Для автоматизации более сложных задач, чем создание программы из единственного файла исходного кода, такой, как будто существует несколько входных файлов или (более применимо к неотложным потребностям) действия, которых Вы желаете сделанный помимо выполнения компилятора, можно создать make-файл для определения целей для make
и укажите, как они зависят от других целей.
Первая цель, определенная в make-файле, является целью по умолчанию: это что make
попытки создать, когда выполнено без параметров командной строки (т.е. когда Вы работаете просто make
, и не что-то как make myProg
).
Обычный способ использовать make-файлы состоит в том, чтобы создать каталог, содержащий все файлы исходного кода (и любые другие файлы) раньше создавал Вашу программу, а также make-файл, который обычно называют Makefile
. Тем именем, make
автоматически найдет его.
Для создания make-файла, можно использовать для выполненного myProg
и это автоматически создаст его сначала при необходимости, поместить myProg.cpp
в новом, в других отношениях пустом каталоге. Создайте другой текстовый файл в том названном каталоге Makefile
.
Можно использовать любой текстовый редактор для этого, но рецепт для правила - команды, перечисленные под нею, который будет выполнен для создания его цели - должны, должен быть расположен с отступом с вкладками, а не пробелами 3 Поэтому, если текстовый редактор в настоящее время настраивается для расположения с отступом с пробелами при нажатии Tab необходимо изменить это.
Например, в Gedit или Pluma, Вы вошли бы в Редактирование> Предпочтения, нажать вкладку Editor, и удостоверяться Вставляют пробелы вместо вкладок, неконтролируем:
Много значений по умолчанию редакторов к расположению с отступом с вкладками и не пробелами, поэтому если Вы не изменили эти настройки прежде, они могут уже быть установлены правильно для make-файлов.
После того как Вы находитесь в своем редакторе и (при необходимости) настроили его, чтобы сделать отступ с вкладками, вставить это:
all: myProg
run: all
./myProg
Если Вы скопируете и вставите это, то это будет неправильно, потому что с пробелами справятся в том, даже при том, что Ваш текстовый редактор не делает их при нажатии Tab. (Это имеет отношение к пути, Спрашивает код дисплеев Ubuntu.), Но можно просто удалить четыре предыдущие пробелов ./myProg
и нажмите Tab для создания вкладки в их месте.
Некоторое значение по умолчанию текстовых редакторов к показыванию вкладки как 8 пробелов или некоторое другое число. Это прекрасно.
Используйте команду:
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
. Это - хорошая вещь, потому что:
-O3
флаг для тяжелой оптимизации или -g
заставить компилятор генерировать отладочные символы, получающееся myProg
исполняемый файл отличался бы.)make
.0: Я рекомендую читать далее, чтобы видеть, как сделать эту работу. Но в случае, если Вы хотите делать попытку его сначала сами: необходимо расположить строки с отступом с вкладками, а не пробелами.
1: Строго говоря фактически любой язык программирования мог быть или интерпретирован или скомпилирован в зависимости от того, какие реализации для него были записаны. Для некоторых языков существуют и интерпретаторы и компиляторы. Однако интерпретируемый C++ является редким - хотя не неслыханный.
2: Деление, встраивающее в компиляцию и соединение и вызов перевода файла исходного кода C++ (.cc/.cpp/.cxx/.C) в компиляцию объектного кода, не является целой историей. Программы в C и C++ (и некоторые другие языки) сначала предварительно обрабатываются. В Вашей программе, заменах препроцессора C #include<iostream>
с содержанием <iostream>
заголовочный файл перед фактической компиляцией запускается. И в самом узком смысле компиляция преобразовывает исходный код в ассемблер, а не объектный код. Много компиляторов (как GCC/g++
) может объединить компиляцию и блок в одноэтапном, и не производят ассемблерный код, если не спросили сделать так.
В то время как предварительная обработка является отдельным шагом, GCC и другие компиляторы автоматически выполняют препроцессор. Точно так же они могут автоматически выполнить компоновщика, который является, почему всю последовательность предварительной обработки, компиляции, блока и связи иногда называют, "компилируя" вместо "здания". (Обратите внимание также, что здание может содержать больше, чем те шаги - например, оно может включить генерирующиеся файлы ресурсов, запущение скрипта, чтобы настроить, как вещи будут созданы, и т.д.),
3: Только необходимо сделать отступ с вкладками в самом make-файле. Используя make-файл не налагает требований к способу, которым Вы пишете свои файлы исходного кода C++ сами. Не стесняйтесь переключать добавление отступа назад от вкладок до пробелов, когда Вы будете работать над другими файлами. (И если Вам действительно не нравится делать отступ с вкладками в make-файле, можно установить .RECIPEPREFIX
специальная переменная.)