Как скомпилировать и запустить программу haskell в системе ubuntu linux?

Шаг 3 — Компиляция нескольких файлов

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

  • Файл, становясь большим, увеличивает время компиляции, и малейшие изменения в исходном тексте автоматически вынуждают тратить время программиста на перекомпиляцию программы.
  • Если над программой работает много человек, то практически невозможно отследить сделанные изменения.
  • Процесс правки и само ориентирование при большом исходном тексте становится сложным и поиск небольшой ошибки может повлечь за собой вынужденное «изучение» кода заново.

Это далеко не все пробемы, которые могут возникнуть при наличии программы «монстра». Поэтому при разработке программ рекомендуется их разбивать на куски, которые функционально ограничены и закончены. В этом значительно помогает сам язык C++, предоставляя свой богатый синтаксис.

Для того, чтобы вынести функцию или переменную в отдельный файл надо перед ней поставить зарезервированное слово extern. Давайте для примера создадим программу из нескольких файлов. Сначала создадим главную программу, в которой будут две внешние процедуры. Назовем этот файл main.c:

#include // описываем функцию f1() как внешнюю
extern int f1();

// описываем функцию f2() как внешнюю
extern int f2();

int main()
{
	int n1, n2;

	n1 = f1();
	n2 = f2();

	printf("f1() = %d\n",n1);
	printf("f2() = %d\n",n2);

	return 0;
}

Теперь создаем два файла, каждый из которых будет содержать полное определение внешней функции из главной программы. Файлы назовем f1.c и f2.c:

// файл f1.c
int f1()
{
	return 2;
}

// файл f2.c
int f2()
{
	return 10;
}

После этого процесс компиляции программы с помощью gcc будет выглядеть несколько иначе от описанного в «Шаг 1 — Компиляция программ на языке C/C++».

Компилировать можно все файлы одновременно одной командой, перечисляя составные файлы через пробел после ключа -c:

gcc -c main.c f1.c f2.c

Или каждый файл в отдельности:

gcc -c f1.c
gcc -c f2.c
gcc -c main.c

В результате работы компилятора мы получим три отдельных объектных файла:

main.o
f1.o
f2.o

Чтобы их собрать в один файл с помощью gcc надо использовать ключ -o, при этом линкер соберет все файлы в один:

gcc main.o f1.o f2.o -o rezult

В результате вызова полученной программы rezult командой:

./rezult

На экране появится результат работы:

dron:~# ./rezult
f1() = 2
f2() = 10
dron:~#

Теперь, если мы изменим какую-то из процедур, например f1():

int f1()
{
	return 25;
}

То компилировать заново все файлы не придется, а понадобится лишь скомпилировать измененный файл и собрать результирующий файл из кусков:

dron:~# gcc -c f1.c
dron:~# gcc main.o f1.o f2.o -o rezult2
dron:~# ./rezult2
f1() = 25
f2() = 10
dron:~#

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


Предыдущий Шаг | Следующий Шаг | ОглавлениеАвтор .

4 ответа

30

AFAIK единственный способ быть уверенным в безопасности — это написать компилятор на языке ассемблера (или самостоятельно изменить диск) ). Только тогда вы можете убедиться, что ваш компилятор не вставляет бэкдор — это работает, потому что вы фактически полностью устраняете компилятор.

Оттуда вы можете использовать свой компилятор с нуля для загрузки, например. GNU toolchain. Затем вы можете использовать свою собственную инструментальную цепочку для компиляции системы Linux From Scratch .

Обратите внимание, что для облегчения работы над собой у вас может быть второй промежуточный компилятор, написанный на C (или на любом другом языке). Поэтому вы должны написать компилятор A в сборке, а затем переписать этот компилятор в C /C ++ /Python /Brainfuck /what, чтобы получить компилятор B, который вы компилируете с использованием компилятора A

Затем вы должны использовать компилятор B для компиляции gcc и друзей.

22

Одним из возможных способов, хотя на практике было бы очень много времени, было бы вернуться к корням. Разработка GNU началась в 1984 году, а оригинальная версия Minix (которая использовалась во время ранней разработки Linux для начальной загрузки) была выпущена в 1987 году.

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

Если вы можете найти копию оригинальной книги Minix с исходным кодом, вы можете ввести ее из книги. Скомпилируйте его, а затем используйте другой декомпилятор в другой системе, чтобы убедиться, что компилятор генерирует двоичный вывод ожидаемого машинного языка. (Код составляет всего 12 000 строк, предположительно C, поэтому это занимает много времени, но все еще в рамках reason , если вы серьезно относитесь к такому проекту.) Вы даже можете написать свой собственный дизассемблер; это не должно быть очень сложно.

В какой-то момент у вас будет система, которая может компилировать и загружать раннюю версию ядра Linux, как это было сделано в начале 1990-х годов, когда Linux начал набирать силу среди хакеров. Я бы предложил перейти на Linux в этот момент (перестроить системные библиотеки и инструментальную цепочку против Linux, построить ядро ​​Linux, загрузиться в Linux и, возможно, перестроить ядро ​​Linux и GNU toolchain в Linux, последнее доказывает, хостинг), но это в значительной степени зависит от вас. Продолжайте проверять исправления, исправлять ядро, библиотеки и базовые инструменты GNU, а также перестраивать, пока не дойдете до современных версий.

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

9

Если вам нужен надежный компилятор, вы можете взглянуть на академическую работу, например, на проект compcert . Это компилятор, созданный INRIA (французской ИТ-публичной лабораторией), разработанный как «сертифицированный», т. Е. Для создания исполняемого файла, который семантически идеально эквивалентен коду (и, конечно же, он был математически доказан).

2

В то время как создание собственного компилятора в качестве отправной точки будет наиболее безопасным, другой вариант заключается в установке системы с 5 (или 10) летнего установочного компакт-диска, который, как вы полагаете, был создан до того, как эти эксплойты существовали. Затем используйте это как основу для скомпилирования нового проверяемого источника.

Основные аспекты использования GDB

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

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

Вы можете получить дополнительную информацию о данном параметре компилятора на его .

На следующем шаге следует убедиться в том, что отладчик GDB установлен в вашей системе. Если он не установлен и вы используете основанный на Debian дистрибутив, такой, как Ubuntu, вы можете установить данный инструмент с помощью следующей команды:

sudo apt-get install gdb

Инструкции по установке отладчика в других дистрибутивах приведены на .

Теперь, когда вы скомпилировали вашу программу со специальным параметром компилятора для ее подготовки к отладке и установили в систему отладчик GDB, вы можете выполнить программу в режиме отладки с помощью следующей команды:

gdb 

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

Для того, чтобы инициировать исполнение вашей программы, вам придется выполнить следующую команду GDB:

run

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

run 

GDB поддерживает большое количество полезных команд, которые находят свое применение в процессе отладки программных продуктов. Мы обсудим некоторые из них в следующем разделе.

Использование динамических библиотек

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

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

Вместо этого библиотека libdl.so (компонуемая к приложению) предоставляет для работы с
динамическим загрузчиком интерфейс, содержащий 4 функции:

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

Функция в качестве второго параметра получает
управляющий флаг, определяющий детали загрузки библиотеки, который может иметь следующие значения:

  • — разрешение адресов по именам объектов происходит
    только для используемых объектов (это не относится к глобальным переменным — они разрешаются
    непосредственно в момент загрузки);
  • — разрешение всех адресов происходит до возврата
    из функции;
  • — разрешает использовать объекты, определенные
    в загружаемой библиотеке для разрешения адресов из других загружаемых библиотек;
  • — запрещает использовать объекты из загружаемой
    библиотеки для разрешения адресов из других загружаемых библиотек.
  • — указывает не загружать библиотеку в память, а
    только проверить ее наличие в памяти. При использовании совместно с флагом
    позволяет «глобализовать» библиотеку,
    предварительно загруженную локально ().
  • — помещает таблицу загружаемых объектов в
    самый верх таблицы глобальных символов. Это гарантирует использование только своих функций и нивелирует
    их переопределение функций другими библиотеками.
  • — отключает выгрузку библиотеки при
    уменьшении счетчика ссылок на нее до 0.

Файлы INSTALL или README

Могут иметься дополнительные инструкции, которые должны быть выполнены до начала компиляции. Чтение этого файла (как правило, INSTALL) также поможет узнать, какие библиотеки разработчиков, возможно, потребуется установить в первую очередь. Такие пакеты будут содержать суффикс «-dev», чтобы показать, что они относятся к разработке и должны быть установлены для компиляции. Сценарий configure также может потребовать дополнительных параметров. README содержат любую другую информацию.

Вы даже можете обнаружить, что ни одна из трех команд не запускается. Вместо этого может использоваться другой вариант make, например qmake (для проектов Qt) или cmake.

Компиляция программ Linux

Первое что нам понадобиться — это исходники самой программы. В этом примере мы будем собирать самую последнюю версию vim. Это вполне нейтральная программа, достаточно простая и нужная всем, поэтому она отлично подойдет для примера.

Получение исходников

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

Давайте загрузим сами исходники нашей программы с помощью утилиты git:

Также, можно было скачать архив на сайте, и затем распаковать его в нужную папку, но так будет удобнее. Утилита создаст папку с именем программы, нам нужно сделать ее рабочей:

Настройка configure

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

Если configure нет в папке с исходниками, вы можете попытаться выполнить такие скрипты чтобы его создать:

Также для создания этого скрипта можно воспользоваться утилитой automake:

Утилита automake и другие из ее набора генерируют необходимые файлы на основе файла Mackefile.am. Этот файл обязательно есть в большинстве проектов.

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

Рассмотрим наиболее часто используемые, стандартные для всех программ опции:

  • —prefix=PREFIX — папка для установки программы, вместо /, например, может быть /usr/local/, тогда все файлы будут распространены не по основной файловой системе, а в /usr/local;
  • —bindir=DIR — папка для размещения исполняемых файлов, должна находится в PREFIX;
  • —libdir=DIR — папка для размещения и поиска библиотек по умолчанию, тоже в PREFIX;
  • —includedir=DIR — папка для размещения man страниц;
  • —disable-возможность — отключить указанную возможность;
  • —enable-возможность — включить возможность;
  • —with-библиотека — подобно enable активирует указанную библиотеку или заголовочный файл;
  • —without-библиотека — подобное disable отключает использование библиотеки.

Вы можете выполнить configure без опций, чтобы использовать значения по умолчанию, но также можете вручную указать нужные пути. В нашем случае ./configure есть, и мы можем его использовать:

Во время настройки утилита будет проверять, есть ли все необходимые библиотеки в системе, и если нет, вам придется их установить или отключить эту функцию, если это возможно. Например, может возникнуть такая ошибка: no terminal library found checking for tgetent()… configure: error: NOT FOUND!

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

Приставка lib всегда добавляется перед библиотеками, а -dev — означает, что нам нужна библиотека со всеми заголовочными файлами. После удовлетворения всех зависимостей настройка пройдет успешно.

Сборка программы

Когда настройка будет завершена и Makefile будет готов, вы сможете перейти непосредственно к сборке программы. На этом этапе выполняется непосредственно преобразование исходного кода в машинный. Утилита make на основе Makefile сделает все необходимые действия:

Дальше осталось установить саму программу, если вы использовали опцию prefix, чтобы не устанавливать программу в основную файловую систему, то можно применить стандартную опцию make:

После этого программа будет установлена в указанную вами папку, и вы сможете ее использовать. Но более правильный путь — создавать пакет для установки программы, это делается с помощью утилиты checkinstall, она позволяет создавать как deb, так и rpm пакеты, поэтому может использоваться не только в Ubuntu. Вместо make install выполните:

Затем просто установите получившийся пакет с помощью dpkg:

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

Если вы устанавливали программу с помощью make install, то удалить ее можно выполнив в той же папке обратную команду:

Команда удалит все файлы, которые были скопированы в файловую систему.

Шаги

Метод 1

Использование GCC для Unix

  1. 1

    В Unix-системе откройте терминал.

  2. 2

    Введите gcc --version и нажмите ↵ Enter. Отобразится версия компилятора C. Если команда не сработала, скорее всего, GCC не установлен.

    • Если компилятор не установлен, почитайте документацию к своему дистрибутиву Linux, чтобы узнать, как скачать соответствующий пакет.
    • Если вы компилируете программу, написанную на языке C++, вместо «gcc» введите «g++».
  3. 3

    Перейдите в каталог, в котором хранится исходный код.

    Например, если файл с исходным кодом «main.c» находится в каталоге /usr/wikiHow/source, введите cd /usr/wikiHow/source.

  4. 4

    Введите gcc main.c -o HelloWorld. Замените «main.c» на имя файла с исходным кодом, а «HelloWorld» замените на имя конечной программы. Программа будет скомпилирована.

    • Если на экране появились сообщения об ошибках, введите gcc -Wall -o errorlog file1.c, чтобы получить дополнительную информацию. Затем в текущем каталоге откройте файл «errorlog»; для этого введите cat errorlog.
    • Чтобы скомпилировать одну программу из нескольких файлов с исходным кодом, введите gcc -o outputfile file1.c file2.c file3.c.
    • Чтобы скомпилировать сразу несколько программ из нескольких файлов с исходными кодами, введите gcc -c file1.c file2.c file3.c.
  5. 5

    Запустите скомпилированную программу. Введите 46;/HelloWorld, где «HelloWorld» замените именем программы.

Метод 2

Использование MinGW для Windows

1

2

Запустите установочный файл MinGW.Если файл не запустился автоматически, дважды щелкните по нему в папке для загрузок, а затем нажмите «Установить».

3

Задайте параметры установки и нажмите Continue (Далее).Рекомендуем установить MinGW в папку по умолчанию, а именно в (C:\MinGW). Если нужно поменять папку, не выбирайте папку, в названии которой присутствуют пробелы, такую как «Program Files».

4

Выберите компиляторы, которые нужно установить.
На левой панели рекомендуем нажать «Basic Setup» (Обычная установка). Затем на правой панели поставьте флажки рядом со всеми перечисленными компиляторами.
Более опытные пользователи могут выбрать опцию «All packages» (Все пакеты) и отметить дополнительные компиляторы.

5

Откройте меню Installation (Установка). Оно находится в верхнем левом углу MinGW.

6

Нажмите Apply Changes (Применить изменения).

7

Нажмите Apply (Применить). Компиляторы будут загружены и установлены.

8

В путь к MinGW вставьте системные переменные среды. Сделайте следующее:
Нажмите ⊞ Win+S, чтобы открыть строку поиска, и введите среда.
В результатах поиска щелкните по «Изменение системных переменных среды».
Нажмите «Переменные среды».
Нажмите «Изменить» (под «Пользовательские переменные»).
Прокрутите вниз информацию в поле «Значение переменной».
Непосредственно под последней записью введите ;C:\MinGW\bin

Обратите внимание, что если вы установили MinGW в другую папку, введите ;C:\путь-к-папке\bin.
Дважды нажмите «OK». Еще раз нажмите «OK», чтобы закрыть окно.

9

Откройте командную строку в качестве администратора

Для этого:
Нажмите ⊞ Win+S и введите строка.
В результатах поиска щелкните правой кнопкой мыши по «Командная строка» и в меню выберите «Запуск от имени администратора».
Нажмите «Да», чтобы разрешить внесение изменений.

10

Перейдите в папку, в которой хранится файл с исходным кодом.Например, если файл с исходным кодом «helloworld.c» находится в папке C:\Source\Programs, введите cd C:\Source\Programs.

11

Введите gcc helloworld.c -o helloworld.exe. Замените «helloworld» на имя файла с исходным кодом и имя программы. По завершении компиляции программы вы вернетесь в командную строку, при этом не будет никаких сообщений об ошибках.Любые ошибки программирования должны быть устранены перед компиляцией программы.

12

Чтобы запустить программу, введите ее имя. Если программа называется helloworld.exe, введите это имя, чтобы запустить программу.

Советы

  • Компиляция кода с помощью флага -g приведет к созданию отладочной информации, которая может быть использована соответствующим отладчиком, например, GDB.
  • Создайте сборочный файл проекта (make-файл), чтобы упростить компиляцию больших программ.
  • Если вы активно используете оптимизацию, помните, что оптимизация по скорости может привести к снижению размера и, иногда, качества (и наоборот).
  • При компиляции программы на языке C++ используйте G++ так же, как вы используете GCC. Помните, что файлы с исходным кодом на языке C++ имеют расширение .cpp, а не .c.

Что вам понадобится

  • Компьютер под управлением Linux или Windows
  • Базовые знания GNU/Linux и знание того, как устанавливать приложения
  • Программный код
  • Текстовый редактор (например, Emacs)

Извлечение и компилирование исходного кода на VPS

 Загрузка Tarball

Для начала нужно скачать исходный код cURL. Существует множество способов это сделать, но в данном руководстве используется tarball, доступный на сайте cURL. При желании URL в следующей команде можно заменить на URL текущей версии cURL, но при этом нужно помнить, что это должна быть ссылка на файл «tar.gz». Запустите:

Это скачает и сохранит исходный код как curl.tar.gz в текущем каталоге.

Теперь нужно извлечь tarball. Для этого запустите:

Исходный код будет расположен в папке по имени «curl-» с номером версии. При вводе:

будет выведен подобный результат:

В данном случае папка называется «curl-7.32.0», следовательно, чтобы войти в эту папку, нужно ввести:

 Конфигурирование и компилирование исходного кода

В этой папке можно найти множество разных файлов

На данный момент нужно обратить внимание на файл «configure». Это скрипт, созданный для того, чтобы помочь запустить программу на различных компьютерах

Запустите:

Это автоматически использует переменные текущей системы, чтобы подготовить исходный код для данного VPS. В основном эта команда проверяет, соответствуют ли библиотеки, установленные в системе, тем, что нужны программе. Данное действие указывает компилятору, где искать библиотеки, нужные исходному коду, в данном случае cURL. Кроме того, данное действие определяет, куда впоследствии установить пакет.  По завершению будет создан файл Makefile со всей нужной в нем информацией. Теперь все готово для компилирования исходного кода. Для этого запустите команду:

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

Теперь make будет следовать инструкциям в «Makefile», чтобы установить скомпилированные пакеты. В большинстве случаев это все, что нужно для установки. Теперь можно ввести curl. Если cURL был установлен верно, будет выведен примерно такой результат:

При извещении об ошибке bash введите:

Это создаст ссылку на /usr/bin/curl, которая соединяется с /usr/local/bin/curl. Это позволит запустить cURL, просто введя curl в консоль. Обычно это выполняется автоматически, но в некоторых случаях скрипт конфигурации не может найти нужное местоположение установки. Теперь можно ввести:

Это запустит текущую версию cURL. Выведенный результат имеет примерно такой вид:

Готово! cURL был успешно скомпилирован и установлен из исходного кода.

Итоги

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

Запомните последовательность: ./configure, затем make, а затем make install.

CentOScURLDebianLinuxmakeTarballUbuntuVPS

В какие директории следует устанавливать ПО

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


Основные директории, где располагается ПО

Директория Назначение
/usr/ Стандартное ПО, поставляемое с системой.
/usr/X11R6/ Система X-Window и разнообразное ПО для нее.
/usr/local/ Локальное ПО (обычно от третьих поставщиков), установленное
администратором отдельно после инсталляции системы. Здесь может
располагаться также отдельно установленное ПО под
X-Window.

Как очевидно, «вручную» программы надо устанавливать именно в
/usr/local/.

В каждой из этих иерархий имеются поддиректории bin/, lib/,
man/ и doc/, служащие для исполняемых файлов, библиотек,
man-страниц и документации соответственно.

В переменной окружения PATH есть ссылки на /usr/bin,
/usr/X11R6/bin и /usr/local/bin, так что все программы
запускаются просто по имени. Команда man же, соответственно, ищет
man-страницы также во всех трех man-директориях.

Естественно, весь дистрибутив следует ставить внутрь одной иерархии.
Так, если исполняемые файлы располагаются в /usr/local/bin/, то
man-страницы — в /usr/local/man/, а библиотечные файлы — в
/usr/local/lib/.

Некоторые пакеты (например, Wabi — эмулятор Windows 3.x) устанавливаются в
директорию /opt/. В этом случае создается директория вида
/opt/имя-программы/ (например, /opt/wabi/), и в ней
размещаются все файлы пакета. Такие пакеты обычно не предлагают выбор
директории, а просто сами ставятся в /opt/.

Подробно про то, какие директории в файловой системе для чего предназначены,
можно прочитать в «Filesystem Hierarchy Standard» (прежнее название — «Linux
FSSTND») по адресу

Проверка

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

При нахождении различий печатается ключевая строка, с обозначением отличий и
имя файла, в котором они найдены.

Сравниваются следующие параметры:

5
Контрольная сумма (подсчитанная по алгоритму MD5)
S
Размер файла
L
Символьный линк (мне это не разу не встречалось, так что что это…)
T
Время модификации
D
Устройство (раздел), на котором расположен файл
U
Владелец
G
Группа-владелец
M
Права доступа

Проверку лучше выполнять как «root«, так как некоторые файлы
(например, /usr/X11R6/bin/xterm) могут быть недоступны на чтение другим
пользователям и для них всегда будет выдаваться несовпадение по контрольной
сумме.

Пример:

bobby:~# rpm -y setup
S.5....T c /etc/exports
S.5....T c /etc/printcap
S.5....T c /etc/securetty
S.5....T c /etc/services
bobby:~# _

Как видно из этого примера, в некоторых файлах обязательно будут отличия,
поскольку тот же /etc/passwd изменяется при создании и изменении
пользователей.

Аналогично команде rpm -q, rpm -y можно вместо
имени пакета указывать «-f файл» или «-a«.

Команда rpm -ya полезна для проверки всей системы, но ее
исполнение занимает много времени.

Установка при помощи инсталлятора

Adobe Acrobat Reader — это программа для просмотра файлов .pdf, которая
может работать как самостоятельно, так и в качестве plugin для Netscape. Версия
4.0 для Linux имеется на ftp-сервере фирмы Adobe в директории

Опять первым делом развернем архив:

bobby:~/soft% tar xvzf ~/linux-ar-40.tar.gz
ILINXR.install/
ILINXR.install/INSTALL
ILINXR.install/INSTGUID.TXT
ILINXR.install/LICREAD.TXT
ILINXR.install/ILINXR.TAR
ILINXR.install/READ.TAR
bobby:~/soft% ls -l ILINXR.install/
total 16297
-rw-r-----   1 ivanov   lab5     13755392 Feb 26 05:17 ILINXR.TAR
-rwxr-x---   1 ivanov   lab5        39573 Feb 26 05:17 INSTALL
-rw-r-----   1 ivanov   lab5        20106 Feb 26 05:17 INSTGUID.TXT
-rw-r-----   1 ivanov   lab5         6076 Feb 26 05:17 LICREAD.TXT
-rw-r-----   1 ivanov   lab5      2796544 Feb 26 05:17 READ.TAR
bobby:~/soft% _

Итак, мы видим исполняемый файл INSTALL, пару больших .tar-файлов (содержащих
собственно файлы программы) и два .txt-файла. Из названий ясно, что инструкции
по установке — в INSTGUID.TXT.

Внимательно прочитав его, мы узнаем, что надо перейти в директорию с
дистрибутивом и запустить скрипт INSTALL. Итак,

bobby:~/soft% su
Password:
bobby:~/soft# cd ILINXR.install/
bobby:~/soft# ./INSTALL

После выдачи на экран лицензионного соглашения программа просит набрать
«accept«, если мы согласны с его положениями.

Затем она укажет требуемое свободное место на диске и спросит, в какую
директорию надо ставить программу. По умолчанию предлагается
/usr/local/Acrobat4, на что мы и согласимся, нажав
. После вопроса, надо ли создать эту директорию (поскольку
она не существует) программа проведет собственно инсталляцию.

Please type "accept" to accept the terms and conditions license agreement;
Type "decline" to exit. accept

This installation requires 16MB of free disk space.

Enter installation directory for Acrobat 4.0 [/usr/local/Acrobat4] 

Directory "/usr/local/Acrobat4" does not exist.
Do you want to create it now?  y

Installing platform independent files ... Done

Installing platform dependent files ... Done

bobby:~/soft/ILINXR.install# _

Как и следовало ожидать, в директории /usr/local/Acrobat4 появились
файлы программы:

bobby:~/soft/ILINXR.install# ls -l /usr/local/Acrobat4/
total 4
drwxr-xr-x   3 1436     users        1024 May  8 22:14 Browsers
drwxr-xr-x   5 root     root         1024 May  8 22:13 Reader
drwxr-xr-x   3 1436     users        1024 May  8 22:13 Resource
drwxr-xr-x   2 1436     users        1024 May  8 22:14 bin
bobby:~/soft/ILINXR.install# _

Но вот незадача — их владельцем является несуществующий пользователь с
uid=1436 и группа users. Но владельцем всех программ (за исключением так
называемых «сюидных» (setuid, suid)) должны быть пользователь «root» и
группа «root«. Для исправления ситуации достаточно команды

Далее, программа acroread в директории Acrobat4/bin/ имеет
права доступа «-rwxr-x--x«, что не позволяет запускать ее обычным
пользователям (поскольку это скрипт, то кроме «x» требуется еще и «r»).
Исправляем:

Теперь запустив как обычный пользователь файл
/usr/local/Acrobat4/bin/acroread, после некоторой паузы видим окно
программы.

Окно программы
Acroread

Последнее что осталось сделать — настроить запуск программы по короткой
команде, без /usr/local/… Для этого достаточно сделать в
/usr/local/bin/ символьный линк, указывающий на исполняемый файл:

Ввод и вывод на языке С++

В Python и в С ввод и вывод синтаксически оформлены как вызов функции, а в С++ — это операция над объектом специального типа — потоком.

Потоки определяются в библиотеке где определены операции ввода и вывода для каждого встроенного типа.

Все идентификаторы стандартной библиотеки определены в пространстве имен , что означает необходимость обращения к ним через квалификатор .

std::cout  "mipt";
std::cout  2018;
std::cout  '.';
std::cout  true;
std::cout  std::endl;

Заметим, что в С++ мы не прописываем типы выводимых значений, компилятор неким (пока непонятным) способом разбирается в типе выводимого значения и выводит его соответствующим образом.

Вывод в один и тот же поток можно писать в одну строчку:

std::cout  "mipt"  2018  '.'  true  std::endl;

Для вывода в поток ошибок определён поток .

Поток ввода с клавиатуры называется , а считывание из потока производится другой операцией — :

std::cin >> x;

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

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

Например для введенной строки «Иван Иванович Иванов»,

std::string name;
std::cin >> name;

считает в name только первое слово «Иван».

Считать всю строку целиком можно с помощью функции :

std::string name;
std::getline(std::cin, name);

Считывать несколько значений можно и в одну строку:

std::cin >> x >> y >> z;

Напишите программу, которая считает гипотенузу прямоугольного треугольника по двум катетам. Ввод и вывод стандартные.

Ввод Вывод
3 4 5
Ссылка на основную публикацию