Компания ALT Linux
Опубликован: 07.03.2015 | Доступ: свободный | Студентов: 1714 / 223 | Длительность: 24:14:00
Дополнительный материал 1:

Использование компилятора командной строки и текстового редактора Geany

< Лекция 15 || Дополнительный материал 1 || Дополнительный материал 2 >

Одним из самых мощных современных кроссплатформенных компиляторов языка C++ является свободно-распространяемый компилятор g++. Для его установки в debian-подобных ОС семейства Linux (Debian, Ubuntu, Mint и их клоны) достаточно выполнить команду терминала apt-get install g++ с правами суперпользователя (администратора) или воспользоваться менеджером пакетов synaptic.

Установка компилятора g++ в ОС семейства Windows несколько сложнее, поэтому рассмотрим этот процесс более подробно.

  1. На сайте mingw.org переходим в раздел Download (Загрузки), в появившемся окне щёлкаем по ссылке Download mingw-get-setup.exe (рис. A.1). Загружаем установочный файл и запускаем его.
  2. На первом этапе установки необходимо выбрать команду Install (см. рис. A.2), затем папку для установки (рис. A.3).
  3. После этого начнётся процесс доустановки инсталлятора (рис. A.4).
  4. Далее выбираем компиляторы для установки (C++, Fortran, Ada) (рис. A.5) и ждём пока будут скачаны и установлены необходимые компиляторы. После завершения процесса установки компиляторы (в нашем случае компилятор C++) готовы к использованию. Но для вызова их (из командной строки Windows, из текстового редактора Geany) необходимо указывать полное имя файла с компилятором. При установке компилятора C++ в стандартный каталог C:\MinGW — полное имя компилятора C++ будет таким: C:\MinGW\bin\g++. Для того, чтобы каждый раз не писать полное имя компилятора, можно добавить путь C:\MinGW\bin в список путей системной переменной Path.
  5. Для изменения значения системной переменной Path необходимо в панели управления выбрать Система -> Дополнительные параметры системы -> Дополнительно -> Переменные среды -> Системные переменные -> Path -> Изменить. В открывшемся диалоговом окне добавить путь C:\MinGW\bin\.
Окно загрузки mingw.

увеличить изображение
Рис. A.1. Окно загрузки mingw.

После перезагрузки ОС Windows для обращения к компилятору достаточно будет указывать его имя — g++.

Таким образом, в ОС Linux для работы с компилятором в командной строке необходимо запустить Терминал, а в ОС Windows – командную строку. После чего работа с компилятором g++ с ОС Windows и Linux идентична.

Рассмотрим опции компилятора командной строки, необходимые для компиляции и запуска простейших программ.

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

g++ name.cpp

Здесь name.cppимя файла с текстом программы. В результате будет создан исполняемый файл со стандартным именем a.out. Для того, чтобы создать исполняемый файл с другим именем, необходимо выполнить команду

g++ -o nameout name.cpp

Здесь name.cppимя файла с текстом программы, nameout — имя исполняемого файла.

При использовании компилятора g++ после компиляции программы автоматически происходит компоновка программы (запуск компоновщика make). Чтобы исключить автоматическую компоновку программы, следует использовать опцию -c. В этом случае команда будет иметь вид g++ -c name.cpp

Первое окно установки mingw.

Рис. A.2. Первое окно установки mingw.
Выбор папки для установка компилятора.

Рис. A.3. Выбор папки для установка компилятора.

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

Загрузка инсталлятора.

Рис. A.4. Загрузка инсталлятора.
Выбор устанавливаемых компиляторов.

увеличить изображение
Рис. A.5. Выбор устанавливаемых компиляторов.

Компилятор g++ эффективен при разработке больших комплексов программ, он позволяет собирать приложения из нескольких файлов, создавать библиотеки программ. Рассмотрим процесс создания и использования библиотеки решения задач линейной алгебры (см. п. 6.4, задачи 6.10 — 6.12):

int SLAU(double **matrica_a, int n, double *massiv_b, double *x)функция решения системы линейных алгебраических уравнений;

int INVERSE(double **a, int n, double **y)функция вычисления обратной матрицы;

double determinant(double **matrica_a, int n)функция вычисления определителя.

Для создания библиотеки создадим заголовочный файл slau.h и файл slau.cpp, в который поместим тексты всех трёх функций решения задач линейной алгебры.

Текст файла slau1.h:

int SLAU( double ** matrica_a, int n, double *massiv_b, double *x );
int INVERSE( double **a, int n, double **y );
double determinant ( double ** matrica_a, int n );

Текст файла slau1.cpp:

#include <math.h>
int SLAU( double ** matrica_a, int n, double *massiv_b, double *x )
{
	int i, j, k, r;
	double c,M, max, s;
	double **a, *b;
a=new double * [ n ];
for ( i =0; i<n; i++)
a [ i ]=new double [ n ];
b=new double [ n ];
	for ( i =0; i<n; i++)
		for ( j =0; j<n; j++)
			a [ i ] [ j ]=matrica_a [ i ] [ j ];
	for ( i =0; i<n; i++)
		b [ i ]=massiv_b [ i ];
	for ( k=0;k<n; k++)
	{
		max=fabs ( a [ k ] [ k ] );
		r=k;
		for ( i=k+1; i<n; i++)
			if ( fabs ( a [ i ] [ k ] )>max)
			{
				max=fabs ( a [ i ] [ k ] );
				r= i;
			}
		for ( j =0; j<n; j++)
		{
			c=a [ k ] [ j ];
			a [ k ] [ j ]=a [ r ] [ j ];
			a [ r ] [ j ]= c;
		}
		c=b [ k ];
		b [ k ]=b [ r ];
		b [ r ]= c;
		for ( i=k+1; i<n; i++)
		{
		for (M=a [ i ] [ k ] / a [ k ] [ k ], j=k; j<n; j++)
			a [ i ] [ j ]-=M*a [ k ] [ j ];
		b [ i ]-=M*b [ k ];
		}
	}
	if ( a [ n -1 ] [ n-1]==0)
		if ( b [ n-1]==0)
			return -1;
		else return -2;
	else
	{
	for ( i=n-1; i >=0; i --)
	{
		for ( s =0, j= i +1; j<n; j++)
			s+=a [ i ] [ j ] * x [ j ];
		x [ i ]=( b [ i ]- s ) / a [ i ] [ i ];
	}
	return 0;
	}
}
int INVERSE( double **a, int n, double **y )
{
	int i, j, res;
	double *b, *x;
	b=new double [ n ];
	x=new double [ n ];
	for ( i =0; i<n; i++)
	{
		for ( j =0; j<n; j++)
			if ( j==i )
				b [ j ]= 1;
		else b [ j ]= 0;
		res=SLAU( a, n, b, x );
		if ( res !=0)
			break;
		else
			for ( j =0; j<n; j++)
				y [ j ] [ i ]=x [ j ];
	}
	if ( res !=0)
		return -1;
	else
		return 0;
}
double determinant ( double ** matrica_a, int n )
{
	int i, j, k, r;
	double c,M, max, s, det =1;
	double **a;
	a=new double * [ n ];
	for ( i =0; i<n; i++)
		a [ i ]=new double [ n ];
	for ( i =0; i<n; i++)
		for ( j =0; j<n; j++)
			a [ i ] [ j ]=matrica_a [ i ] [ j ];
	for ( k=0;k<n; k++)
	{
		max=fabs ( a [ k ] [ k ] );
		r=k;
		for ( i=k+1; i<n; i++)
			if ( fabs ( a [ i ] [ k ] )>max)
			{
				max=fabs ( a [ i ] [ k ] );
				r= i;
			}
		if ( r !=k ) det=_det;
	for ( j =0; j<n; j++)
	{
		c=a [ k ] [ j ];
		a [ k ] [ j ]=a [ r ] [ j ];
		a [ r ] [ j ]= c;
	}
	for ( i=k+1; i<n; i++)
		for (M=a [ i ] [ k ] / a [ k ] [ k ], j=k; j<n; j++)
			a [ i ] [ j ]_=M_a [ k ] [ j ];
	}
	for ( i =0; i<n; i++)
		det*=a [ i ] [ i ];
	return det;
	for ( i =0; i<n; i++)
		delete [ ] a [ i ];
	delete [ ] a;
}

В качестве тестовой задачи напишем главную функцию, которая предназначена для решения системы линейных алгебраических уравнений.

#include <iostream>
#include <math.h>
//Подключение личной библиотеки slau
#include " slau1 .h "
using namespace std;
int main ( )
{
	int result, i, j,N;
	double **a, *b, *x;
	//Ввод размерности системы.
	cout<<" N = ";
	cin>>N;
	//Выделение памяти для матрицы правых частей и вектора свободных членов.
	a=new double * [N ];
	for ( i =0; i<N; i++)
		a [ i ]=new double [N ];
	b=new double [N ];
	x=new double [N ];
	//Ввод матрицы правых частей и вектора свободных членов .
	cout<<" Input Matrix A "<<endl;
	for ( i =0; i<N; i++)
		for ( j =0; j<N; j++)
			cin>>a [ i ] [ j ];
	cout<<" Input massiv B "<<endl;
	for ( i =0; i<N; i++)
		cin>>b [ i ];
	//Вызов функции решения СЛАУ методом Гаусса из библиотеки slau.h
	result=SLAU( a,N, b, x );
	if ( result ==0)
	{
		//Вывод массива решения.
		cout<<" MassivX "<<endl;
		for ( i =0; i<N; i++)
			cout<<x [ i ]<<" \t ";
		cout<<endl;
	}
	else if ( result ==-1)
		cout<<"Бесконечное множество решений\n ";
		else if ( result ==-2)
			cout<<"Нет решений\n ";
}

Теперь необходимо из этих текстов создать работающее приложение. Рассмотрим это поэтапно.

  1. Компиляция библиотеки slau1.h с помощью команды g++ -c slau1.cpp.
  2. Компиляция главной функции main.cpp с помощью команды g++ -c main.cpp.
  3. Создание исполняемого файла с именем primer из двух откомпилированных файлов main.o и slau1.o с помощью команды g++ main.o slau1.o -o primer.
  4. Запуск исполняемого файла.

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

При разработке программ с большим количеством вычислений, компилятор g++ позволяет оптимизировать программы по быстродействию. Для получения оптимизированных программ можно использовать ключи -O0, -O1, -O2, -O3, -Os:

  • при использовании ключа -O0 оптимизация отключена, достигается максимальная скорость компиляции, опция задействована по умолчанию;
  • при использовании ключа "мягкой" оптимизации -O1 происходит некоторое увеличение времени компиляции, этот ключ оптимизации позволяет одновременно уменьшать занимаемую программой память и уменьшить время выполнения программы;
  • при использовании ключа -02 происходит существенное уменьшение времени работы программы, при этом не происходит увеличение памяти, занимаемой программой, не происходит развёртка циклов и автоматическое встраивание функций;
  • ключ "агрессивной" оптимизации -O3 нацелен в первую очередь на уменьшение времени выполнения программы, при этом может произойти увеличение объёма кода и времени компиляции, в этом случае происходит развёртка циклов и автоматическое встраивание функций;
  • ключ -Os ориентирован на оптимизацию размера программы, включаются те опции из набора -O2, которые обычно не увеличивают объём кода, применяются некоторые другие оптимизации, направленные на снижение его объёма.

Для разработки программ на различных языках программирования можно использовать текстовый редактор Geany. Редактор Geany входит в репозитории большинства дистрибутивов Linux, его установка осуществляется стандартным для вашего дистрибутива образом (в debian-подобных ОС с помощью команды apt-get install geany). Для установки его в Windows необходимо скачать со страницы http://www.geany.org/Download/Releases инсталляционный файл и установить программу стандартным способом.

Разработка программ с использованием Geany более эффективна. Окно Geany представлено на рис. A.6.

Последовательно рассмотрим основные этапы разработки программы с использованием Geany.

  • Необходимо создать шаблон приложения на C/C++ (или другом языке программирования) с помощью команды Файл -> Создать из шаблона -> main.cxx. После чего необходимо ввести текст программы и сохранить его.
  • Для компиляции и запуска программы на выполнение служит пункт меню Сборка. Для компиляции программы следует использовать команду Сборка -> Скомпилировать (F8). В этом случае будет построен объектный код программы (файл с расширением .o или .obj). Для создания исполняемого кода программы служит команда Сборка -> Собрать (Shift+F9). Для запуска программы следует выполнить команду Сборка -> Выполнить (F5).

Параметры компилятора определяются автоматически после выбора шаблона (Файл -> Создать из шаблона). Однако команды компиляции и сборки по умолчанию можно изменить, используя команду Сборка -> Установить параметры сборки (см. рис. A.7). Здесь %f — имя компилируемого файла, %eимя файла без расширения.

Окно Geany.

увеличить изображение
Рис. A.6. Окно Geany.
Настройка компиляции программ на языке C++ в Geany.

увеличить изображение
Рис. A.7. Настройка компиляции программ на языке C++ в Geany.
< Лекция 15 || Дополнительный материал 1 || Дополнительный материал 2 >
Сергей Радыгин
Сергей Радыгин

Символы кириллицы выводит некорректно. Как сделать чтобы выводился читабельный текст на русском языке?

Тип приложения - не Qt,

Qt Creator 4.5.0 основан на Qt 5.10.0. Win7.

 

Юрий Герко
Юрий Герко

Кому удалось собрать пример из раздела 13.2 Компоновка (Layouts)? Если создавать проект по изложенному алгоритму, автоматически не создается  файл mainwindow.cpp. Если создавать этот файл вручную и добавлять в проект, сборка не получается - компилятор сообщает об отсутствии класса MainWindow. Как правильно выполнить пример?

Alex Arhipov
Alex Arhipov
Россия, Сочи
Николай Катющев
Николай Катющев
Украина, Одесса