1. Написать программный комплекс, состоящий из приложения и динамической библиотеки. Приложение должно выполнять простейшие операции с текстовыми файлами. Ключи:
- Входной файл;
- Выходной файл;
- Операция (сортировка строк по убыванию/возрастанию, разрезание строк до определенной длины).
Исходный код библиотеки:
streditlib.h
#ifndef _MYFUNC_H
#define _MYFUNC_H
#include <string>
#include <list>
#include <fstream>
#include <vector>
#include <algorithm>
#include <iostream>
#include <locale>
#include <stdio.h>
using namespace std;
extern int Sort(string Input, string Output);//Функциясортировки
extern int Crop(string Input, string Output, int N);//Функцияобрезаниястрок
#endif
streditlib.cpp
#include "myfunc.h"
bool compare(string a, string b)
{
return (a.compare(b) < 0);
}
int Sort(string Input, string Output)//Функциясортировки
{
vector<string> list;//Массивстрок
string line;
//Чтениефайла
fstreamfileRead(Input.c_str());
for ( string line; getline(fileRead, line); )
{
list.push_back(line);
}
fileRead.close();
sort(list.begin(), list.end(), compare);
//Записьфайла
ofstreamfileWrite(Output);
for ( int i = 0; i <list.size(); i++ )
{
fileWrite<< list[i] << "
";
}
fileWrite.close();
return 0;
}
int Crop(string Input, string Output, int N)//Функцияобрезаниястрок
{
vector<string> list;//Массивстрок
//Чтениефайла
fstreamfileRead(Input.c_str());
for ( string line; getline(fileRead, line); )
{
list.push_back(line);
}
fileRead.close();
//Записьфайла
ofstreamfileWrite(Output);
for ( int i = 0; i <list.size(); i++ )
{
for ( int j = 0; j < N; j++ )
{
fileWrite<< list[i][j];
}
fileWrite<< "
";
}
fileWrite.close();
return 0;
}
Исходный код приложения
main.cpp
#include "stdafx.h"
#include "myfunc.h"
#include <stdlib.h>
#include <stdio.h>
#include <getopt.h>
int main(intargc, char* argv[])
{
std::locale rus("rus_rus.866");
std::wcout.imbue(rus);
string Input = "";
string Output = "";
intCropValue = -1;
bool sort = false;
int Help = 0;
const char* short_options = "hs::f:";
int c;
while (1)
{
static struct option long_opt[] =
{
{"help",no_argument,NULL,h},
{"size",required_argument,NULL,s},
{"file",required_argument,NULL,f},
{"crop",required_argument,NULL,c},
{"sort",no_argument,NULL,s},
{NULL,0,NULL,0}
};
intoptIdx;
if((c = getopt_long(argc, argv, short_options, long_opt, &optIdx)) == -1)
break;
switch( c )
{
case i:
Input = optarg;
break;
case o:
Output = optarg;
break;
case c:
CropValue = atoi(optarg);
break;
case s:
sort = true;
break;
case h:
Help = 1;
wcout<<L"Использование:
stredit [ПАРАМЕТР…]
Параметры:
-i ФАЙЛ, --input ФАЙЛ Входнойфайл
-o ФАЙЛ, --output ФАЙЛ Выходнойфайл
-c X, --crop X Обрезатьвсестрокидо Х символов
-s X, --sort X Сортировкастрок: X = 0 - повозрастанию,
X = 1 - поубыванию
-h, --help Показатьэтусправку
";
break;
}
}
if ( (Input == "" || Output == "" || (CropValue == -1 && sort==false)) && Help == 0 )
{
wcout<<L"Используйте -h, --help для вызова справки.
";
}
else
{
if ( CropValue != -1 )
{
Crop(Input, Output, CropValue);
if ( sort != false )
{
Sort(Output, Output);
}
}
else
{
if ( sort != false )
{
Sort(Input, Output);
}
}
wcout<< "Completed.";
}
return 0;
}
Если параметры указаны неверно приложение предлагает воспользоваться справкой
Рис.1.1 Ответ приложения на отсутствие параметров
Попытаемся вызвать справку командой --help
Рис.1.2 Справка
Проверка работы программы
Рис.1.3 Запуск программы с правильными параметрами
Как видим программа работает корректно.
Рис.1.4 Входной файл Рис.1.5 Выходной файл
2. Написать Makefile’ы для программного комплекса. Для библиотеки и основного приложения файлы пишутся отдельно. Вкаждом Makefile епредусмотретьправила complie, install, clean, uninstall.
Создадим две папки Program – папка с программой и Lib– с библиотекой, для каждой напишем свой Makefile.
Lib/Makefile
compile:compileobj
g++ -shared streditlib.o -o libstreditlib.so
compileobj:
g++ -fPIC -c streditlib.cpp -o streditlib.o
install:
cp libstreditlib.so /usr/lib
cpstreditlib.h /usr/include
clean:
rm libstreditlib.so
rmstreditlib.o
uninstall:
rm -rf /usr/lib/libstreditlib.so
rm -rf /usr/include/streditlib.h
Program/Makefile
compile:
g++ stredit.cpp -lstreditlib -o stredit
install:
cpstredit /usr/bin
clean:
rmstredit
uninstall:
rm -rf /usr/bin/stredit
Выполняем команду make
Рис.2.1 Сборка программы и библиотеки с помощью make
3. Написать скрипты конфигурации (configure) для программного комплекса. Для библиотеки и основного приложения файлы пишутся отдельно. Для облегчения процесса написания скрипта использовать утилиту autoconf.
Lib/configure.in
AC_PREREQ([2.69])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AC_CONFIG_SRCDIR([streditlib.cpp])
AC_CONFIG_HEADERS([config.h])
AC_PROG_CXX
AC_PROG_CC
AC_TYPE_SIZE_T
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
Рис.3.1 Сборка библиотеки
Program/configure.in
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AC_CONFIG_SRCDIR([stredit.cpp])
AC_CONFIG_HEADERS([config.h])
# Checks for programs.
AC_PROG_CXX
# Checks for libraries.
# FIXME: Replace `main with a function in `-lstreditlib:
AC_CHECK_LIB([streditlib], [main], [], [ AC_MSG_ERROR([Could not find STREDIT library]) ] )
# Checks for header files.
AC_CHECK_HEADERS([stdlib.h])
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
Рис.3.2 Ошибка библиотека не найдена
4. Написать файлы CMakeLists.txt для программного комплекса. Для библиотеки и основного приложения файлы пишутся отдельно. Для файла основной программы должна быть реализована функция проверки наличия библиотеки. Провести компиляцию программы и библиотеки с использованием созданных файлов и утилиты CMake.
Lib/CMakeLists.txt
cmake_minimum_required(VERSION 2.6)
project(streditlib)
set(CMAKE_INSTALL_PREFIX /home/max/Проекты/Lab4/Lib)
add_library(streditlib SHARED streditlib.cpp streditlib.h)
set(LIB_INSTALL_PATH /usr/lib/)
set(LIB_INCLUDE_PATH /usr/include/)
install(FILES libstreditlib.so DESTINATION ${LIB_INSTALL_PATH})
install(FILES streditlib.h DESTINATION ${LIB_INCLUDE_PATH})
add_custom_target(uninstall
COMMAND rm -rf ${LIB_INSTALL_PATH}/libstreditlib.so
rm -rf ${LIB_INCLUDE_PATH}/streditlib.h
)
Собираем библиотеку
Рис.4.1 Сборка библиотеки с помощью cmake
Program/CMakeLists.txt
cmake_minimum_required(VERSION 2.6)
project(stredit)
set(CMAKE_INSTALL_PREFIX /home/max/Проекты/Lab4/Program)
set(STREDITLIB_INCLUDE_HINT /usr/include)
find_path(STREDITLIB_INCLUDE_DIR streditlib.h HINTS ${STREDITLIB_INCLUDE_HINT})
if(NOT STREDITLIB_INCLUDE_DIR)
message(FATAL_ERROR "Headers of library stredit not found")
endif(NOT STREDITLIB_INCLUDE_DIR)
include_directories(${STREDITLIB_INCLUDE_DIR})
add_executable(stredit stredit.cpp)
set(STREDIT_LIBRARIES_HINT /home/max/Проекты/Lab4/lib)
find_library(STREDITLIB_LIBRARIES streditlib HINTS ${STREDIT_LIBRARIES_HINT})
if(NOT STREDITLIB_LIBRARIES)
message(FATAL_ERROR "Binary files of library stredit not found")
endif(NOT STREDITLIB_LIBRARIES)
target_link_libraries(stredit ${STREDITLIB_LIBRARIES})
install(TARGETS stredit DESTINATION /usr/bin)
install(FILES stredit.1.gz DESTINATION /usr/share/man/ru/man1)
add_custom_target(uninstall
COMMAND rm -rf /usr/bin/stredit
rm -rf /usr/share/man/ru/man1/stredit.1.gz)
Собираем приложение
Рис.4.2 Сборка приложения с помощью cmake
5. Написать документацию в формате man страниц для основной программы из программного комплекса. Документация в формате manстраниц хранится в /usr/share/man/, в частности на русском языке в /usr/share/man/ru/.
/usr/share/man/ru/man1/stredit.1.gz
.TH "stredit" "1" "22 декабря 2014" "версия 1.0" "Пользовательские команды"
.SH НАЗВАНИЕ
stredit - сортирует строки в указанном файле и/или обрезает их до заданной длины
.SH ИСПОЛЬЗОВАНИЕ:
stredit [ПАРАМЕТР…]
Параметры:
-i ФАЙЛ, --input ФАЙЛ Входной файл
-o ФАЙЛ, --output ФАЙЛ Выходной файл
-cX, --cropX Обрезать все строки до Х символов
-sX, --sortX Сортировка строк: X = 0 - по возрастанию,
X = 1 - по убыванию
-h, --help Показать справку
.SH ПРИМЕР:
stredit --input input.txt --output output.txt --crop 5 --sort 0
stredit -i input.txt -o output.txt -s 1
Для того чтобы просмотреть эту страницу нужно выполнить manstredit.
Выглядит она следующим образом:
Рис.5.1 man-страница
6. Создать установочные пакеты для компонентов программного комплекса. Тип пакетов - формат DEB. Список и состав пакетов следующий:
1. Программа. Пакет содержит:
1) откомпилированную версию программы;
2) документацию по программе.
2. Библиотека (основной пакет). Пакет содержит:
1) откомпилированную версию библиотеки.
3. Библиотека (пакет разработчика). Пакет содержит:
1) заголовочные файлы (расширение h).
Создадим соответственно 3 папки: stredit, streditlib и streditlib-dev.В каждую положим необходимые файлы в директории аналогичные установочным.
Параметры пакета хранятся в файле DEBIAN/control
Stredit/DEBIAN/control
Package: stredit
Version: 1.0
Section: utils
Priority: extra
Architecture: all
Depends: streditlib
Maintainer: SamartsevMaksim<aldan123a@yandex.ru>
Description: stredit
Сортировка и обрезание строк в файлах
Рис.6.1 Приложение нельзя установить если не установлена библиотека
Streditlib/DEBIAN/control
Package: streditlib
Version: 1.0
Section: libs
Priority: extra
Architecture: all
Maintainer: SamartsevMaksim<aldan123a@yandex.ru>
Description: streditlib
Библиотека streditlib
Streditlib-dev/DEBIAN/control
Package: streditlib-dev
Version: 1.0
Section: libs
Priority: extra
Architecture: all
Maintainer: SamartsevMaksim<aldan123a@yandex.ru>
Description: streditlib-dev
Библиотека streditlib-dev
Рис.6.2 Установка библиотеки
Рис.6.3 После установки библиотеки без проблем ставится приложение
Основы программной инженерии
Контрольная работа по предмету «Программирование»