Меню Рубрики

Полезные библиотеки для c

C++ — один из самых мощных и востребованных языков программирования. Ежедневно на нём пишут сотни приложений, зачастую использующих GUI. Однако работа с графикой не всегда удобна программисту — в таком случае применяют готовые графические библиотеки. Они позволят сделать разработку графической части приложений максимально быстрой и удобной.

SFML (Simple and Fast Multimedia Library) — одна из самых удобных и быстрых графических библиотек для 2D-графики. Её неоспоримое преимущество — минимальные требования к уровню знаний языка и лёгкость освоения: всего за несколько дней можно написать вполне себе полноценную программу. К примеру, первое графическое приложение «SFML works!» можно написать всего за минуту. Ещё одно неоспоримое преимущество — кроссплатформенность: SFML работает под Windows, Linux (только X11, но не Wayland) и Mac, планируется выход под Android.

SFML библиотека используется по большей части небольшими стартапами и программистами, для которых создание игр — хобби. SFML популярен среди небольших команд благодаря тому, что не требует написания больших объёмов кода.

Qt представляет собой целый набор инструментов для быстрого и удобного проектирования GUI. Конечно же, здесь можно писать и игры — почему бы и нет? — но Qt привлекает программистов в основном тем, что она является быстрой, удобной, гибкой и кроссплатформенной. Во многом Qt обогнала даже SFML: библиотека доступна как на Windows, Linux и Mac, так и на мобильных платформах — Windows Mobile, Android и iOS.

Qt расширяет C++ с помощью МОК (Мета-объектного компилятора) и предоставляет дополнительные функции (например, сигналы и слоты). Также имеет платную службу поддержки (как и платную лицензию). Для Qt есть большой выбор IDE: QtDesigner, QtCreator, QDevelop, Edyuk, а также доступна интеграция с Visual Studio, Eclipse и XCode.

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

Cairo — библиотека для отрисовки векторных изображений под Linux, Windows и Mac OS. К примеру, такой крупный проект, как Mozilla, использует Cairo в браузерном движке Gecko. Также Cairo лежит в основе некоторых операционных систем (MorphOS, AmigaOS) и приложений (InkScape, Synfig, Graphite). При использовании библиотеки будьте готовы к отсутствию русскоязычных ресурсов.

Cairo может взаимодействовать с OpenGL бэкендом с поддержкой GPU, что, конечно, открывает целый список полезных функций.

Кроссплатформенная библиотека Cocos2D-X призванна упростить разработку мобильных игр. Поддерживает все те же платформы, что и Qt. Из плюсов стоит отметить доступность, удобство эксплуатации и создание отдельного конструктора игр, основанного на библиотеке Cocos Creator. В списке игр, основанных на движке, есть всемирно известная BADLAND, работающая на всех доступных платформах.

Если при создании игры вам нужно работать с графикой и анимацией в больших объёмах, то лучше использовать Unity вместо Cocos2D-X. В Unity имеется возможность плавной интеграции с такими инструментами, как Photoshop, Maya или Blender. В Cocos2D-X вся графика добавляется извне и на неё ссылаются из кода.

В Рунете нет уроков по этой библиотеке, но на английском языке есть отличный курс от разработчиков.

Juce — кроссплатформенный фреймворк, предназначенный для создания приложений и плагинов на языке C++.

Документации по Juce много, но не на русском языке. Поэтому можно скачать книгу «Программирование на C++ с JUCE 4.2.x: Создание кроссплатформенных мультимедийных приложений с использованием библиотеки JUCE на простых примерах».

Juce больше популярен среди разработчиков аудио-ПО благодаря набору интерфейсов-оболочек для построения аудио-плагинов.

wxWidgets — одна из старейших, но в то же время наиболее известных графических библиотек для отрисовки GUI. Её основной плюс — производительность. Если QT использует низкоуровневый код лишь для таких элементов, как кнопки и полосы прокрутки, то wxWidgets для каждой системы свой, и благодаря этому все элементы отображаются максимально похожими на системный стиль.

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

В Сети есть урок по работе с библиотекой от её разработчиков.

SDL — кроссплатформенная 2D-библиотека, предназначенная для написания приложений (в основном игр). Поддерживаются Windows, Linux, Mac OS, а также Android, Windows Mobile и iOS. Преимущества библиотеки — быстрота, надёжность и лёгкость в эксплуатации. Также в библиотеке реализованы профессиональные инструменты для работы со звуком — это большой плюс при разработке крупных проектов.

Комбинируется с wxWidgets и хорошо интегрируется с OpenGL.

Существует целый цикл уроков, размещённый на Habr.

Пожалуй, одна из самых известных графических библиотек. GTK+ — графический фреймворк, широко применямый во многих системах. Изначально он задумывался как компонент GIMP, но за 20 лет после выпуска первой стабильной версии он нашёл применение в сотнях других приложений.

Сейчас GTK+ — полноценный графический фреймворк, не уступающий тому же QT. Он поддерживает разные языки программирования и продолжает развиваться.

В своё время библиотека создавалась в качестве альтернативы Qt, которая была платной. GTK+ — один из немногих фреймворков, которые поддерживают язык C. Библиотека кроссплатформенная, но есть мнение, что программы на Linux выглядят более нативно, чем на Windows или Mac (GTK+ хорошо поддерживается даже на KDE). Интересно, что из-за некоторых проблем с кроссплатформенностью Wireshark перешла на Qt.

Пример первой программы можно посмотреть на Википедии.

Другие интересные статьи по C++ можно посмотреть у нас на сайте.

Выше представлены наиболее популярные технологии для работы с GUI не только на C++, но иногда и на других языках (например, Qt и GTK+). Однако всегда следует учитывать особенности той или иной технологии. Выпишите список функций своего приложения, ещё раз прочитайте описания всех библиотек и фреймворков, и только после этого выбирайте то, что действительно подходит больше всего для проекта.

источник

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

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

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

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

Библиотеки бывают двух видов — статические и динамические. Код первых при компиляции полностью входит в состав исполняемого файла, что делает программу легко переносимой. Код динамических библиотек не входит в исполняемый файл, последний содержит лишь ссылку на библиотеку. Если динамическая библиотека будет удалена или перемещена в другое место, то программа работать не будет. С другой стороны, использование динамических библиотек позволяет сократить размер исполняемого файла. Также если в памяти находится две программы, использующие одну и туже динамическую библиотеку, то последняя будет загружена в память лишь единожды.

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

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

В итоге, когда все будет сделано, схема каталогов и файлов будет выглядеть так:

Пусть каталоги library и project находятся в одном общем каталоге, например, домашнем каталоге пользователя. Каталог library содержит каталог source с файлами исходных кодов библиотеки. Также в library будут находиться заголовочный файл (содержащий описания функций библиотеки), статическая (libmy1.a) и динамическая (libmy2.so) библиотеки. Каталог project будет содержать файлы исходных кодов проекта и заголовочный файл с описанием функций проекта. Также после компиляции с подключением библиотеки здесь будет располагаться исполняемый файл проекта.
В операционных системах GNU/Linux имена файлов библиотек должны иметь префикс «lib», статические библиотеки — расширение *.a, динамические — *.so.

Для компиляции проекта достаточно иметь только одну библиотеку: статическую или динамическую. В образовательных целях мы получим обе и сначала скомпилируем проект со статической библиотекой, потом — с динамической. Статическая и динамическая «разновидности» одной библиотеки по-идее должны называться одинаково (различаются только расширения). Поскольку у нас обе библиотеки будут находиться в одном каталоге, то чтобы быть уверенными, что при компиляции проекта мы используем ту, которую хотим, их названия различны (libmy1 и libmy2).

В файле figure.c содержатся две функции — rect() и diagonals() . Первая принимает в качестве аргументов символ и два числа и «рисует» на экране с помощью указанного символа прямоугольник заданной ширины и высоты. Вторая функция выводит на экране две диагонали квадрата («рисует» крестик).

В файле text.c определена единственная функция, принимающая указатель на символ строки. Функция выводит на экране звездочки в количестве, соответствующем длине указанной строки.

Заголовочный файл можно создать в каталоге source, но мы лучше сохраним его там, где будут библиотеки. В данном случае это на уровень выше (каталог library). Тем самым как бы подчеркивается, что файлы исходных кодов после создания из них библиотеки вообще не нужны пользователям библиотек, они нужны лишь разработчику библиотеки. А вот заголовочный файл библиотеки требуется для ее правильного использования.

Статическую библиотеку создать проще, поэтому начнем с нее. Она создается из обычных объектных файлов путем их архивации с помощью утилиты ar.

Все действия, которые описаны ниже выполняются в каталоге library (т.е. туда надо перейти командой cd). Просмотр содержимого каталога выполняется с помощью команды ls или ls -l.

В итоге в каталоге library должно наблюдаться следующее:

Далее используем утилиту ar для создания статической библиотеки:

Параметр r позволяет вставить файлы в архив, если архива нет, то он создается. Далее указывается имя архива, после чего перечисляются файлы, из которых архив создается.

Объектные файлы нам не нужны, поэтому их можно удалить:

В итоге содержимое каталога library должно выглядеть так:

, где libmy1.a — это статическая библиотека.

Объектные файлы для динамической библиотеки компилируются особым образом. Они должны содержать так называемый позиционно-независимый код (position independent code). Наличие такого кода позволяет библиотеке подключаться к программе, когда последняя загружается в память. Это связано с тем, что библиотека и программа не являются единой программой, а значит как угодно могут располагаться в памяти относительно друг друга. Компиляция объектных файлов для динамической библиотеки должна выполняться с опцией -fPIC компилятора gcc:

В отличие от статической библиотеки динамическую создают при помощи gcc указав опцию -shared:

Использованные объектные файлы можно удалить:

В итоге содержимое каталога library:

Теперь в каталоге project (который у нас находится на одном уровне файловой иерархии с library) создадим файлы проекта, который будет использовать созданную библиотеку. Поскольку сама программа будет состоять не из одного файла, то придется здесь также создать заголовочный файл.

Функция data() запрашивает у пользователя данные, помещая их в массив strs. Далее вызывает библиотечную функцию diagonals() , которая выводит на экране «крестик». После этого на каждой итерации цикла вызывается библиотечная функция text() , которой передается очередной элемент массива; функция text() выводит на экране звездочки в количестве равному длине переданной через указатель строки.

Обратите внимание на то, как подключается заголовочный файл библиотеки: через относительный адрес. Две точки обозначают переход в каталог на уровень выше, т.е. родительский по отношению к project, после чего путь продолжается во вложенный в родительский каталог library. Можно было бы указать абсолютный путь, например, «/home/sv/c/les_21/library/mylib.h». Однако при перемещении каталогов библиотеки и программы на другой компьютер или в другой каталог адрес был бы уже не верным. В случае с относительным адресом требуется лишь сохранять расположение каталогов project и library относительно друг друга.

Здесь два раза вызывается библиотечная функция rect() и один раз функция data() из другого файла проекта. Чтобы сообщить функции main() прототип data() также подключается заголовочный файл проекта.

Файл project.h содержит всего одну строчку:

Из обоих файлов проекта с исходным кодом надо получить объектные файлы для объединения их потом с файлом библиотеки. Сначала мы получим исполняемый файл, содержащий статическую библиотеку, потом — связанный с динамической библиотекой. Однако с какой бы библиотекой мы не компоновали объектные файлы проекта, компилируются они как для статической, так и динамической библиотеки одинаково:

При этом не забудьте сделать каталог project текущим!

Теперь в каталоге project есть два объектных файла: main.o и data.o. Их надо скомпилировать в исполняемый файл project, объединив со статической библиотекой libmy1.a. Делается это с помощью такой команды:

Начало команды должно быть понятно: опция -o указывает на то, что компилируется исполняемый файл project из объектных файлов.

Помимо объектных файлов проекта в компиляции участвует и библиотека. Об этом свидетельствует вторая часть команды: -L../library -lmy1. Здесь опция -L указывает на адрес каталога, где находится библиотека, он и следует сразу за ней. После опции -l записывается имя библиотеки, при этом префикс lib и суффикс (неважно .a или .so) усекаются. Обратите внимание, что после данных опций пробел не ставится.

Читайте также:  Полезен ли кроличий навоз для огорода

Опцию -L можно не указывать, если библиотека располагается в стандартных для данной системы каталогах для библиотек. Например, в GNU/Linux это /lib/, /urs/lib/ и др.

Запустив исполняемый файл project и выполнив программу, мы увидим на экране примерно следующее:

Посмотрим размер файла project:

Его размер равен 8698 байт.

Теперь удалим исполняемый файл и получим его уже связанным с динамической библиотекой. Команда компиляции с динамической библиотекой выглядит так:

Здесь в отличии от команды компиляции со статической библиотеки добавлены опции для линковщика: -Wl,-rpath. /library/. -Wl — это обращение к линковщику, -rpath — опция линковщика, ../library/ — значение опции. Получается, что в команде мы два раза указываем местоположение библиотеки: один раз с опцией -L, а второй раз с опцией -rpath. Видимо для того, чтобы понять, почему так следует делать, потребуется более основательно изучить процесс компиляции и компоновки программ на языке C.

Следует заметить, что если вы скомпилируете программу, используя приведенную команду, то исполняемый файл будет запускаться из командной строки только в том случае, если текущий каталог project. Стоит сменить каталог, будет возникать ошибка из-за того, что динамическая библиотека не будет найдена. Но если скомпилировать программу так:

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

Размер исполняемого файла проекта, связанного с динамической библиотекой, получился равным 8604 байта. Это немного меньше, чем при компиляции проекта со статической библиотекой. Если посмотреть на размеры библиотек:

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

источник

Доступным языком заметки по IT технологиям

В один из моментов, я задался вопросом как мне вывести графику используя C++ (С). Я не хотел использовать такие популярные среды Builder или MS Visual с их библиотеками окон. Мне была нужна просто библиотека для работы с простой графикой в консоли.

Если судить по запросам в интернете и на форумах, этот вопрос возникал не только у меня.

После нескольких дней поиска ответа на данный вопрос, я подготовил подбороку данных библиотек. Возможно они пригодятся и вам.

1. WinBGIm — портированная «старая» библиотека от компании Borland для Windows. Изначально она разрабатывалась для отображения графики под DOS.

2. Cairo — библиотека под лицензий GNU, поддерживается многими языками программирования (Delphi, Factor, Haskell, Lua, Perl, PHP, Python, Ruby, Scheme, Smalltalk и т.п.). Также поддержка большого количество операционных систем.

3. SDL — кроссплатформенная мультимедийная библиотека под лицензий GNU реализующая единый программный интерфейс к графической подсистеме, звуковым устройствам и средствам ввода для широкого спектра платформ.

Данная библиотека активно используется при написании кроссплатформенных мультимедийных программ (в основном игр). Поддерживается большим количеством языков программирования (C, C++, C#, VB.NET, D, Ada, Vala, Eiffel, Haskell, Erlang, Euphoria, Java, Lisp, Lua, ML, Pascal, Perl, PHP, Pike, PureBasic, Python и Ruby) и операционных систем (Linux, Microsoft Windows, Mac OS X, iOS и Android).

Из интересной особенности библиотеки, она позволяет работать с джостиком, CD-ROM и сетью.

4. SFML — простая и быстрая кроссплатформенная мультимедийная библиотека, доступная на языках: С++, C, D, Java, Python, Ruby, OCaml, .Net и Go. Является объектно ориентированный аналог SDL. Позволяет работать с аудио, сетью и окнами.

5. Allergo — кроссплатформенная библиотека позволяющая работать с 2D графикой, аудиофайлами, окнами, файловой системой, 3D графикой. Помимо этого библиотека предоставляет дополнительные функции по работе с числами с фиксированной, плавающей запятой и матрицами.

Изначально создавалась для разработки игр под Atari (Allergo расшифровывается как Atari Low-Level Game Routines), сейчас библиотека поддерживается языками: C, C++, Pascal, Python, Lua, Scheme, D, Go, Ada, Lisp, Mercury, Perl, Scheme. Есть поддержка под следующие платформы: Windows, macOS, Unix-подобные системы, Android и iOS.

6. SKIA — компактная графическая библиотека. Её использует в Google Chrome, Chrome OS, Chromium OS, Mozilla Firefox, Android (до 3.0), Firefox OS и Sublime Text 3. Библиотека работает на С и Python.

7. OpenGL (или glut) — библиотека на которой основываются некоторые из выше указанных. Я заявил о ней в самом конце списка, т.к. многие о ней слышали и она достаточно мощна для простых задач вроде 2D графики, но реализовывать она это может. Точнее даже сказать, OpenGL это спецификация, т.е. набор правил описывающих интерфейс, а разработчик оборудования (видеокарты) на её основе разрабатывает библиотеку. Реализуется на большом количество операционных систем и языков программирования.

8. DirectX — библиотека от компании Microsoft только для Windows. Изначально разрабатывалась именно для игр, является конкурентов OpenGL. Позволяет работать с большим количество периферии, сеть, звук, видео, 3D графика, 2D графика, клавиатура, джостик и т.п.

9. Direct2D — библиотека от Microsoft появилась с DirectX v.10. Задача библиотеки отображать 2D графику с использованием аппаратного ускорения, изначально реализовывалась для Windows 7.

Буду признателен если вы поделитесь данным постом

Достаточно широкий список. С ходу и не соображу чем можно добавить. Вроде из популярного всё предложено, выбирай на свой вкус.

источник

Всегда хотел иметь под рукой определённый «джентельменский набор» библиотечных классов, с малой зависимостью, которые можно легко совмещать с другими библиотеками и фреймворками и легко переносить в другие проекты. Как говориться — включил и забыл. И самое главное — «не плати за то, что не используешь» (С) С++

Мне нравятся библиотеки состоящие только из заголовочных файлов. Тем более, что грядут модули в C++! 🙂 Сразу оговорюсь, библиотека nstd ни в коем случае не претендует на место великих и могучих библиотек и фреймворков типа boost, Qt, POCO и т.д. и т.п. Скорее, она является дополнением к ним.

Моя библиотека использует возможности C++17 и состоит из нескольких слабо-зависимых друг от друга функциональных классов. Сразу предупрежу, что библиотека активно дополняется и меняется, и, возможно, на момент чтения вами этой статьи она уже изменилась настолько, что за актуальной информацией лучше обратиться к исходным кодам здесь.

Библиотека содержит несколько примеров по использованию классов. Для них, я включил проекты CodeBlocks (для Windows). Однако, примеры также содержат конфигурационный файл GENie для генерации других типов проектов. Например, можно легко сгенерировать Makefile для этих целей. C++17 поддерживается GCC 7.1 и последними версиями Clang. К сожалению, Visual Studio 2017 пока поддерживает не все возможности нового стандарта, в частности не поддерживается inline для data members и упрощённый способ объявления nested namespaces. Поэтому, в принципе, вы можете сгенерировать проект для VS 2017 через GENie, но он пока не скомпилируется. Хотя, если очень нужно, то можете сами подправить исходники для компиляции в VS 2017, там не сложно.

Если у вас нет CodeBlocks или Вы не хотите его устанавливать, тогда, на примере MinGW-w64 GCC 7.1 для Windows, я опишу как быстро сгенерировать и скомпилировать примеры при помощи GENie и Makefile-ов.

  1. Качаем MinGW-w64 с GCC 7.1, например отсюда. Распаковываем в удобную для вас папку и прописываем в переменную PATH путь к папке MinGW/bin.
  2. Качаем исполняемый файл GENie для Windows (там же есть и для других ОС) отсюда.
  3. Копируем genie.exe в папку с примерами, туда, где лежит файл genie.lua.
  4. Для генерации Makefile-ов, запускаем из папки примеров команду: «genie.exe gmake»
  5. В папке с примерами появятся главный Makefile и sub-мейкфайлы для каждого проекта.
  6. Например, чтобы собрать все примеры в Release конфигурации, запускаем там-же: «mingw32-make.exe config=release». Если хотите собрать только один из примеров, тогда просто нужно добавить имя примера, например: «mingw32-make.exe config=release relinx_example».

Библиотека nstd распространяется под лицензией MIT и содержит не только классы моей разработки, но и сторонние наработки. В описании проекта на Github я указываю, какие именно сторонние классы я включил в проект. В репозитории они лежат в отдельной папке external.

Коротко о текущем содержании nstd:

Класс Relinx я уже представлял на Хабрахабре здесь. Попросту говоря, это LINQ для C++. Поддерживаются «ленивые» вычисления и реализованы почти все методы .NET LINQ. Я решил включить Relinx в nstd. Не пропадать же добру :).

signal_slot классы удобны в том плане, что позволяют сигналам и слотам автоматически отключаться друг от друга при разрушении соединения между ними. Каждая связь слота с сигналом любого типа представлена классом connection, при разрушении которого происходит разрыв связки signal-slot. Важно то, что connection, в отличии от сигналов и слотов, не является template-ом, что позволяет сохранять его в любой контейнер, независимо от типов сигнала и слота. Соответственно, при разрушении этого контейнера, все связи с сигналами будут разорваны. Это удобно, когда объект, содержащий данный контейнер, разрушается, при этом не нужно специально отсоединяться от сигналов — это произойдёт автоматически.

live_property построен на базе signal_slot классов. Это обвязка над типами, которая позволяет отслеживать изменения над ними и, при желании, можно управлять поведением: изменять значение или нет.

expiry_cache это template контейнер, который хранит данные только определённое время и оповещает сигналом об истечении срока годности данных. Работает в двух режимах: продлевает жизнь данным, если к ним было обращение в течении времени хранения, и режим без продления жизни данных. Также, есть режим автоматической очистки в фоновом режиме через отдельный поток (auto vacuum).

json — сторонняя библиотека работы с форматом данных JSON.

asio — сторонняя библиотека работы с сетевыми подключениями. Возможно, скоро войдёт в стандарт C++.

urdl — сторонняя библиотека от автора asio, но форкнутая и развиваемая другими разработчиками. Она позволяет удобно загружать данные из сети.

sqlite — это сторонняя обёртка над sqlite3. Очень интересная реализация.

quantum random number provider — это класс-генератор случайных чисел с использованием бесплатного сервиса QRNG (http://qrng.anu.edu.au), который возвращает случайные числа, сгенерированные на квантовом оборудовании.

За примерами использования этих классов (и некоторых других, которые я здесь не упомянул), обращайтесь к репозиторию на Github здесь. Если останутся вопросы или возникнут хорошие предложения — обращайтесь!

Я активно пытаюсь дополнять библиотеку nstd полезными классами. Предлагаю всем желающим принять участие в развитии nstd библиотеки. Если есть хорошие и полезные классы, то присылайте мне. Постараюсь адаптировать и включить в библиотеку.

В ближайших планах хочу реализовать remote signals, работающие через TCP или UDP соединение. Эти сигналы хочу использовать для связи между процессами и связи по сети.

Есть ещё задумка реализовать GUI классы на основе Blend2D или AGG и с использованием своей реализации signals slots. Пока не определился, какую из графических библиотек взять за основу. Буду рад выслушать ваше мнение по этому вопросу.

Хардкорная конфа по С++. Мы приглашаем только профи.

источник

Помимо стандартной библиотеки, содержащей основные модули языка С++, разработаны десятки, а то и сотни дополнительных библиотек. Каждая из этих библиотек содержит программы и подпрограммы, производящие ряд действий.

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

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

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

Если Вам нужен удобный инструмент для работы с JavaScript, V8 подойдёт идеально.

Свои функции V8 реализует, используя специальные классы, написанные на с++ и объявленные в namespace V8. Работать с джава скрипт – структурами можно через привычную оболочку с++.

Схема взаимодействия объектов с++ и V8 реализована посредством использования v8::Handle (template-классов).

Установка V8 обычно не занимает много времени, а польза для тех, кому периодически приходится работать с JavaScript’ом, неоценима.

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

Так или иначе, почти все разработчики на разных этапах сталкиваются с необходимостью отображать web – элементы. Чтобы всё выглядело красиво и в коде, и в конечном отображении, а выполнение этой задачи не отнимало слишком много времени и сил, существует библиотека WebKit.

Некоторые программисты называют WebKit «чёрным ящиком», органично перерабатывающим html, css и JavaScript в полноценные веб-страницы.

Awesomium — это библиотека для интеграции браузера (на базе Chromium) в своё приложение. Библиотека имеет 2 режима работы: Offscreen и Windowed.

В режиме Offscreen отрисовка и работа скриптов на экране не отображается.

В режиме Windowed средствами библиотеки эффективно выполняется отрисовка в «окне приписки» и обработка активности мыши и клавиатуры.

Awesomium активно применяется в десятках разных приложений. Описаны случаи интеграции этой библиотеки в 3D игры.

Существенный минус – отсутствие активного сообщества, способного познакомить новичка с библиотекой, ответить на вопросы и исправить ошибки. А документация, доступная для работы с Awesomium на с++, даёт довольно смутное представление о принципах работы библиотеки.

Читайте также:  План характеристики рельефа и полезных ископаемых материка африка

Тем не менее, Awesomium остаётся очень удобным инструментом, завоевавшим признание сотен разработчиков по всему миру.

Хотите упростить взаимодействие с сервером? – используйте Libcurl.

Libcurl помогает передавать данные (изображения, файлы и пр.) приложениям. Libcurl поддерживает 13 основных протоколов FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, LDAP, а также POP3, IMAP и SMTP.

Изначально cUrl предназначался для использования на языке С. Сейчас для работы с Libcurl разработаны модули интеграции к 30 языкам программирования. Что говорит о высокой популярности библиотеки в среде разработчиков. На это же указывает высокий рейтинг продукта.

Библиотек для сжатия данных довольно много, одна из самых удобных и популярных

Сжатие любых объёмов данных (даже превышающих объём памяти) с помощью zlib проводится предельно легко.

Zlib написана на языке С и применяется в тысячах проектов. Использование некоторых других библиотек невозможно без использования zlib. Примером такой библиотеки является основная библиотека для работы с растровой графикой в формате .png – libpng.

Libpng, написанная на C с использованием ассемблера, предназначена для работы с изображениями в формате .png.

Для работы с изображениями в формате .jpg существует библиотека libjpg (также написанная на С с использованием Ассемблера)

Обе библиотеки имеют подробные инструкции и множество примеров использования как в С, так и в С++.

Периодически возникает необходимость конвертировать файлы в формат pdf. Для этого процесса разработана динамическая библиотека DynaPDF.

DynaPDF – удобный гибкий инструмент. Формат .dll хотя и открывает достаточно широкие возможности, периодически становится причиной возникновения ошибок.

Для успешного устранения ошибок в сети есть много пошаговых инструкций.

Используется для программирования на языках C/C++, C#, Delphi, Lazarus, PHP, VB, VBA, and VB .Net.

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

Libpq – удобная библиотека для взаимодействия С и PosgreSQL. Благодаря ей из кода С можно вносить изменения в базу данных, добавлять и безвозвратно удалять данные, создавать и удалять таблицы.

Существуют вариации libpq для C++, Python’a, Perl’a, Tcl, ECPG.

Ещё один важный пласт знаний для программиста – отладка и тестирование кода. Знание специфических библиотек, существенно упростит Вам решение этой задачи, а коллегам наглядно продемонстрирует уровень вашего профессионализма.

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

Для модульного тестирования на языке С++ используется Google C++ Testing Framework (Google Test).

С помощью этой библиотеки создаются программы, отслеживающие трафик, поступающий на сетевую карту компьютера. Это может быть очень полезно для отладки программ, составления мониторинговых отчётов и т.п.

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

Ещё Вам может пригодиться…

Libusb – это библиотека, которая позволяет обмениваться данными с USB-устройствами прямо из кода программы.

В библиотеке поддерживаются все типы передачи (управление / объем / прерывание / изохронность). Важный элемент библиотеки – журнал сообщений. Он помогает правильно расшифровать коды ошибок, поступающие от USB- устройств.

Предназначена для работы с С. Для других языков программирования разработаны обёртки. Для С++ – Libusbpp

Библиотека ZBar предназначена для распознавания штрихкодов из изображений.

ZBar имеет предельно простую и логичную документацию без «тёмной магии» и необъяснимых функций.

Работать с ней легко и удобно. Можно использовать из программных интерфейсов С, С++, Питона и других языков программирования.

Большинство описанных библиотек работают и под Windows, и под Linux, и под macOS, и под BSD. Разработчики библиотек предоставляют подробную техническую документацию, а комьюнити готово поделиться пошаговыми инструкциями по установке и ответить на любые рабочие вопросы.

Умение работать с библиотеками – важный навык для любого программиста. Это своеобразный показатель его профессионального уровня и понимания процесса разработки.

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

Не бойтесь новых задач – ищите их решение.

Пишите код, тестируйте и оттачивайте его до блеска. А команда progtips.ru всегда придёт Вам на помощь!

Вы думаете, это все полезные библиотеки? Нет! На десерт мы оставили самое интересное.

В следующем выпуске Вас ждут:

– лучшие графические библиотеки для С++;

– чем пользуются разработчики компьютерных игр в России и на Западе;

и как по графической библиотеке отличить любителя от профессионала.

источник

Язык
Заголовочные файлы
Концепты
Поддержка языка
Ошибка
Утилиты
Строки
Контейнеры
Алгоритмы
Итераторы
Работа с числами
Ввод/вывод
Локализация
Регулярные выражения (C++11)
Атомарные операции (C++11)
Потоки (C++11)
Файловая система (C++17)
Технические спецификации

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

Утилиты общего назначения: управление программой, динамическое выделение памяти, случайные числа, сортировка и поиск Функции и макро-константы для управления сигналами Макросы (и функции), которые сохраняют (и восстанавливают) контекст выполнения Обработка списков аргументов произвольной длины Утилиты для получения информации о типах во время выполнения (начиная с C++11) std::type_index (начиная с C++11) Информация о типах в процессе компиляции шаблон класса std::bitset Функциональные объекты, функциональные вызовы, операции связывания и ссылочные обёртки Различные компоненты утилит Си-подобные утилиты, связанные с временем и датами (начиная с C++11) C++ утилиты времени стандартные макросы и typedef’ы (начиная с C++11) шаблон класса std::initializer_list (начиная с C++11) шаблон класса std::tuple (начиная с C++17) класс std::any (начиная с C++17) шаблон класса std::optional (начиная с C++17) шаблон класса std::variant (начиная с C++20) Поддержка оператора трёхстороннего сравнения Функции определения класса символов Функции определения класса широких символов Различные функции обработки строк Различные функции обработки широких и многобайтовых строк (начиная с C++11) C-style Функции преобразования символов юникода шаблон класса std::basic_string (начиная с C++17) шаблон класса std::basic_string_view (начиная с C++20) std::to_chars и std::from_chars (начиная с C++11) контейнер std::array контейнер std::vector контейнер std::deque контейнер std::list (начиная с C++11) контейнер std::forward_list контейнеры std::set и std::multiset ассоциативные контейнеры std::map и std::multimap (начиная с C++11) неупорядоченные контейнеры std::unordered_set и std::unordered_multiset (начиная с C++11) неупорядоченные ассоциативные контейнеры std::unordered_map и std::unordered_multimap контейнер-обёртка std::stack структуры данных std::queue и std::priority_queue forward-объявления всех классов библиотеки ввода/вывода класс std::ios_base , шаблона класса std::basic_ios и несколько typedef’ов шаблон класса std::basic_istream и несколько typedef’ов шаблоны классов std::basic_ostream , std::basic_iostream и несколько typedef’ов несколько объектов стандартных потоков шаблоны классов std::basic_fstream , std::basic_ifstream , std::basic_ofstream и несколько typedef’ов шаблоны классов std::basic_stringstream , std::basic_istringstream , std::basic_ostringstream и несколько typedef’ов (начиная с C++20) std::basic_osyncstream , std::basic_syncbuf и typedef’ы (устарело) std:: strstream , std:: istrstream , std:: ostrstream Вспомогательные функции для управления форматом ввода и вывода шаблон класса std::basic_streambuf Си-подобные функции ввода/вывода (library fundamentals TS) Расширения стандартной библиотеки и Расширения для Параллелизма (library fundamentals TS) Расширения стандартной библиотеки (library fundamentals TS) Расширения стандартной библиотеки (library fundamentals TS) Расширения стандартной библиотеки (parallelism TS) Расширения для Параллелизма (parallelism TS) Расширения для Параллелизма (filesystem TS) Библиотека файловой системы (library fundamentals TS) Расширения стандартной библиотеки (library fundamentals TS) Расширения стандартной библиотеки (library fundamentals TS) Расширения стандартной библиотеки (library fundamentals TS) Расширения стандартной библиотеки (library fundamentals TS) Расширения стандартной библиотеки (library fundamentals TS) Расширения стандартной библиотеки (library fundamentals TS) Расширения стандартной библиотеки (parallelism TS) Расширения для Параллелизма (library fundamentals TS) Расширения стандартной библиотеки (library fundamentals TS) Расширения стандартной библиотеки (library fundamentals TS) Расширения стандартной библиотеки (library fundamentals TS) Расширения стандартной библиотеки (library fundamentals TS) Расширения стандартной библиотеки (library fundamentals TS) Расширения стандартной библиотеки (library fundamentals TS) Расширения стандартной библиотеки (library fundamentals TS) Расширения стандартной библиотеки (library fundamentals TS) Расширения стандартной библиотеки (library fundamentals TS) Расширения стандартной библиотеки (library fundamentals TS) Расширения стандартной библиотеки (library fundamentals TS) Расширения стандартной библиотеки (library fundamentals TS) Расширения стандартной библиотеки

Для некоторых стандартных заголовочных файлов Си, имеющих вид xxx. h , стандартная библиотека C++ включает как заголовочный файл с таким же именем, так и другой заголовочный файл с именем cxxx (все значимые заголовочные файлы вида cxxx перечислены ниже).

Кроме исключения в виде complex. h , каждый заголовочный файл стандартной библиотеки C++ вида xxx. h помещает в глобальное пространство имён каждый элемент, который соответствующий заголовочный файл вида cxxx помещает в пространство имён std .

Этим заголовочным файлам разрешается также помещать такие же элементы в протранство имён std , а соответствующим заголовочным файлам вида cxxx разрешается также помещать такие же элементы в глобальное пространство имён: включение точно предоставит std:: malloc и также может предоставить :: malloc . Включение точно предоставит :: malloc и также может предоставить std:: malloc . Это относится даже к функциям и перегрузкам функций, которые не являются частью стандартной библиотеки Си.

(устарело) ведёт себя так, как если бы каждый элемент из находился в глобальном пространстве имён
(устарело) ведёт себя так, как если бы каждый элемент из находился в глобальном пространстве имён
(устарело) ведёт себя так, как если бы каждый элемент из находился в глобальном пространстве имён
(устарело) ведёт себя так, как если бы каждый элемент из находился в глобальном пространстве имён
(устарело) ведёт себя так, как если бы каждый элемент из находился в глобальном пространстве имён
(устарело) ведёт себя так, как если бы каждый элемент из находился в глобальном пространстве имён
(устарело) ведёт себя так, как если бы каждый элемент из находился в глобальном пространстве имён
(устарело) ведёт себя так, как если бы каждый элемент из находился в глобальном пространстве имён
(устарело) ведёт себя так, как если бы каждый элемент из находился в глобальном пространстве имён
за исключением элементов специальных математических функций
(устарело) ведёт себя так, как если бы каждый элемент из находился в глобальном пространстве имён
(устарело) ведёт себя так, как если бы каждый элемент из находился в глобальном пространстве имён
(устарело) ведёт себя так, как если бы каждый элемент из находился в глобальном пространстве имён
(устарело) ведёт себя так, как если бы каждый элемент из находился в глобальном пространстве имён
за исключением элементов std::byte и связанных функций
(устарело) ведёт себя так, как если бы каждый элемент из находился в глобальном пространстве имён
(устарело) ведёт себя так, как если бы каждый элемент из находился в глобальном пространстве имён
(устарело) ведёт себя так, как если бы каждый элемент из находился в глобальном пространстве имён
(устарело) ведёт себя так, как если бы каждый элемент из находился в глобальном пространстве имён
(устарело) ведёт себя так, как если бы каждый элемент из находился в глобальном пространстве имён
(устарело) ведёт себя так, как если бы каждый элемент из находился в глобальном пространстве имён
(устарело) ведёт себя так, как если бы каждый элемент из находился в глобальном пространстве имён
(устарело) ведёт себя так, как если бы каждый элемент из находился в глобальном пространстве имён

Заголовочные файлы языка Си , и не включены в C++ и не имеют эквивалентных вида cxxx .

Заголовочные файлы , , и не содержат никакого содержимого из стандартной библиотеки Си и вместо этого просто включают другие заголовочные файлы стандартной библиотеки C++. Использование всех этих заголовочных файлов считается устаревшим в C++.

(начиная с C++11) (deprecated in C++17) только лишь включает заголовочный файл
(устарело) только лишь включает заголовочный файл
(начиная с C++11) (deprecated in C++17) только лишь включает заголовочные файлы и : перегрузки, эквивалентные содержимому заголовочного файла языка Си tgmath.h уже предоставляются этими заголовочными файлами
(устарело) только лишь включает заголовочный файл

Заголовочные файлы , и не имеют смысла в C++ потому что макросы, которые они предоставляли для Си, являются ключевыми словами языка C++.

источник

Standard Template Library(STL), или стандартная библиотека шаблонов, повлияла на архитектурное строение C++ и стала ядром языка. STL – это набор универсальных компонентов и современных высокоэффективных алгоритмов для управления данными. Благодаря этой C++ библиотеке программисту стали доступны передовые достижения в области структур данных и эффективных алгоритмов без необходимости детального осмысления их строения и работы.

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

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

Компоненты STL способны работать с произвольными типами данных. Это достигается тем, что все компоненты C++ библиотеки являются шаблонами, позволяющими использовать любые типы, если они способны выполнять необходимые операции. То есть контейнеры и алгоритмы обобщены по отношению к типам. Данная концепция называется обобщенным программированием.

Несмотря на изменения, которые были привнесены в C++ с появлением STL, не стоит забывать, что язык представлял собой эффективный и многофункциональный инструмент программирования и до ее появления, и все свои черты C++ сохранил (например, библиотека system или ctime) и с появлением STL лишь приумножил.

Читайте также:  Фасоль полезна ли при похудении

Строительными блоками библиотеки являются тщательно структурированные компоненты и их отлаженное взаимодействие. Основными такими блоками являются контейнеры, итераторы и алгоритмы. С++ библиотека STL обеспечивает удивительный уровень гибкости в программировании, но при этом является сложной для постижения и требовательной ко времени освоения.

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

  • Последовательные контейнеры. Они представляют собой упорядоченные коллекции. У каждого элемента своя позиция, которая зависит от времени вставки и не зависит от значения элемента. Последовательных контейнеров 5 разновидностей: array, vector, deque, list, forward list.
  • Ассоциативные контейнеры. Это также упорядоченные коллекции элементов, однако их позиция зависит от значения самого элемента или ключа, если элементами коллекции являются пары «ключ-значение». Существует 4 стандартных ассоциативных контейнеров: set, multiset, map, multimap.
  • Неупорядоченные ассоциативные контейнеры. В данном случае на порядок элементов в коллекции не влияет ни значение, ни время вставки элемента в коллекцию. Если вставить в такую коллекцию n-ое количество элементов, их порядок будет непредсказуем. Более того, с течением времени он может меняться. Неупорядоченными контейнерами являются: unordered set, unordered multiset, unordered map, unordered multimap.

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

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

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

Для крайне сложных задач разработан механизм вспомогательных функций, вызываемых алгоритмами. Это обеспечивает необходимую гибкость для обработки специфичных случаев. Например, программист может задать особый критерий поиска. С появлением лямбда-функций появились возможности для описания любых операций, проводимых над элементами контейнеров при их обходе. Таким образом библиотека функций C++ представляет очень гибкие возможности.

В С++ библиотеке STL-данные управляются контейнерными классами, а операции – настраиваемыми алгоритмами. Получается, что концепция библиотеки STL разделяет данные и операции, что противоречит принципам объектно-ориентированного программирования, которые требуют объединения данных и операций. Однако этому есть оправдание. Благодаря взаимодействию любых алгоритмов с любыми контейнерами путем итераторов программист может объединить любые данные с любыми операциями. Таким образом, устраняется противоречие с ООП и при этом достигается совершенно новый уровень гибкости.

STL представляет собой новый или усовершенствованный подход к программированию. Зачатки библиотеки появились давно. Первые идеи зародились в 1992-1994 годах. И после многолетней разработки STL полностью вошла в состав стандарта C++11. Библиотека обладает обширной функциональностью и отличной гибкостью, однако при этом сложна для понимания. Ее документация насчитывает сотни web-страниц (например, документация на сайте Microsoft библиотеки Visual C++), а описание занимает книги на 1000+ страниц. При этом библиотека находится в активной разработке.

источник

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

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

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

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

Библиотеки бывают двух видов — статические и динамические. Код первых при компиляции полностью входит в состав исполняемого файла, что делает программу легко переносимой. Код динамических библиотек не входит в исполняемый файл, последний содержит лишь ссылку на библиотеку. Если динамическая библиотека будет удалена или перемещена в другое место, то программа работать не будет. С другой стороны, использование динамических библиотек позволяет сократить размер исполняемого файла. Также если в памяти находится две программы, использующие одну и туже динамическую библиотеку, то последняя будет загружена в память лишь единожды.

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

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

В итоге, когда все будет сделано, схема каталогов и файлов будет выглядеть так:

Пусть каталоги library и project находятся в одном общем каталоге, например, домашнем каталоге пользователя. Каталог library содержит каталог source с файлами исходных кодов библиотеки. Также в library будут находиться заголовочный файл (содержащий описания функций библиотеки), статическая (libmy1.a) и динамическая (libmy2.so) библиотеки. Каталог project будет содержать файлы исходных кодов проекта и заголовочный файл с описанием функций проекта. Также после компиляции с подключением библиотеки здесь будет располагаться исполняемый файл проекта.
В операционных системах GNU/Linux имена файлов библиотек должны иметь префикс «lib», статические библиотеки — расширение *.a, динамические — *.so.

Для компиляции проекта достаточно иметь только одну библиотеку: статическую или динамическую. В образовательных целях мы получим обе и сначала скомпилируем проект со статической библиотекой, потом — с динамической. Статическая и динамическая «разновидности» одной библиотеки по-идее должны называться одинаково (различаются только расширения). Поскольку у нас обе библиотеки будут находиться в одном каталоге, то чтобы быть уверенными, что при компиляции проекта мы используем ту, которую хотим, их названия различны (libmy1 и libmy2).

В файле figure.c содержатся две функции — rect() и diagonals() . Первая принимает в качестве аргументов символ и два числа и «рисует» на экране с помощью указанного символа прямоугольник заданной ширины и высоты. Вторая функция выводит на экране две диагонали квадрата («рисует» крестик).

В файле text.c определена единственная функция, принимающая указатель на символ строки. Функция выводит на экране звездочки в количестве, соответствующем длине указанной строки.

Заголовочный файл можно создать в каталоге source, но мы лучше сохраним его там, где будут библиотеки. В данном случае это на уровень выше (каталог library). Тем самым как бы подчеркивается, что файлы исходных кодов после создания из них библиотеки вообще не нужны пользователям библиотек, они нужны лишь разработчику библиотеки. А вот заголовочный файл библиотеки требуется для ее правильного использования.

Статическую библиотеку создать проще, поэтому начнем с нее. Она создается из обычных объектных файлов путем их архивации с помощью утилиты ar.

Все действия, которые описаны ниже выполняются в каталоге library (т.е. туда надо перейти командой cd). Просмотр содержимого каталога выполняется с помощью команды ls или ls -l.

В итоге в каталоге library должно наблюдаться следующее:

Далее используем утилиту ar для создания статической библиотеки:

Параметр r позволяет вставить файлы в архив, если архива нет, то он создается. Далее указывается имя архива, после чего перечисляются файлы, из которых архив создается.

Объектные файлы нам не нужны, поэтому их можно удалить:

В итоге содержимое каталога library должно выглядеть так:

, где libmy1.a — это статическая библиотека.

Объектные файлы для динамической библиотеки компилируются особым образом. Они должны содержать так называемый позиционно-независимый код (position independent code). Наличие такого кода позволяет библиотеке подключаться к программе, когда последняя загружается в память. Это связано с тем, что библиотека и программа не являются единой программой, а значит как угодно могут располагаться в памяти относительно друг друга. Компиляция объектных файлов для динамической библиотеки должна выполняться с опцией -fPIC компилятора gcc:

В отличие от статической библиотеки динамическую создают при помощи gcc указав опцию -shared:

Использованные объектные файлы можно удалить:

В итоге содержимое каталога library:

Теперь в каталоге project (который у нас находится на одном уровне файловой иерархии с library) создадим файлы проекта, который будет использовать созданную библиотеку. Поскольку сама программа будет состоять не из одного файла, то придется здесь также создать заголовочный файл.

Функция data() запрашивает у пользователя данные, помещая их в массив strs. Далее вызывает библиотечную функцию diagonals() , которая выводит на экране «крестик». После этого на каждой итерации цикла вызывается библиотечная функция text() , которой передается очередной элемент массива; функция text() выводит на экране звездочки в количестве равному длине переданной через указатель строки.

Обратите внимание на то, как подключается заголовочный файл библиотеки: через относительный адрес. Две точки обозначают переход в каталог на уровень выше, т.е. родительский по отношению к project, после чего путь продолжается во вложенный в родительский каталог library. Можно было бы указать абсолютный путь, например, «/home/sv/c/les_21/library/mylib.h». Однако при перемещении каталогов библиотеки и программы на другой компьютер или в другой каталог адрес был бы уже не верным. В случае с относительным адресом требуется лишь сохранять расположение каталогов project и library относительно друг друга.

Здесь два раза вызывается библиотечная функция rect() и один раз функция data() из другого файла проекта. Чтобы сообщить функции main() прототип data() также подключается заголовочный файл проекта.

Файл project.h содержит всего одну строчку:

Из обоих файлов проекта с исходным кодом надо получить объектные файлы для объединения их потом с файлом библиотеки. Сначала мы получим исполняемый файл, содержащий статическую библиотеку, потом — связанный с динамической библиотекой. Однако с какой бы библиотекой мы не компоновали объектные файлы проекта, компилируются они как для статической, так и динамической библиотеки одинаково:

При этом не забудьте сделать каталог project текущим!

Теперь в каталоге project есть два объектных файла: main.o и data.o. Их надо скомпилировать в исполняемый файл project, объединив со статической библиотекой libmy1.a. Делается это с помощью такой команды:

Начало команды должно быть понятно: опция -o указывает на то, что компилируется исполняемый файл project из объектных файлов.

Помимо объектных файлов проекта в компиляции участвует и библиотека. Об этом свидетельствует вторая часть команды: -L../library -lmy1. Здесь опция -L указывает на адрес каталога, где находится библиотека, он и следует сразу за ней. После опции -l записывается имя библиотеки, при этом префикс lib и суффикс (неважно .a или .so) усекаются. Обратите внимание, что после данных опций пробел не ставится.

Опцию -L можно не указывать, если библиотека располагается в стандартных для данной системы каталогах для библиотек. Например, в GNU/Linux это /lib/, /urs/lib/ и др.

Запустив исполняемый файл project и выполнив программу, мы увидим на экране примерно следующее:

Посмотрим размер файла project:

Его размер равен 8698 байт.

Теперь удалим исполняемый файл и получим его уже связанным с динамической библиотекой. Команда компиляции с динамической библиотекой выглядит так:

Здесь в отличии от команды компиляции со статической библиотеки добавлены опции для линковщика: -Wl,-rpath. /library/. -Wl — это обращение к линковщику, -rpath — опция линковщика, ../library/ — значение опции. Получается, что в команде мы два раза указываем местоположение библиотеки: один раз с опцией -L, а второй раз с опцией -rpath. Видимо для того, чтобы понять, почему так следует делать, потребуется более основательно изучить процесс компиляции и компоновки программ на языке C.

Следует заметить, что если вы скомпилируете программу, используя приведенную команду, то исполняемый файл будет запускаться из командной строки только в том случае, если текущий каталог project. Стоит сменить каталог, будет возникать ошибка из-за того, что динамическая библиотека не будет найдена. Но если скомпилировать программу так:

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

Размер исполняемого файла проекта, связанного с динамической библиотекой, получился равным 8604 байта. Это немного меньше, чем при компиляции проекта со статической библиотекой. Если посмотреть на размеры библиотек:

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

источник

Источники:
  • http://younglinux.info/c/library
  • http://s-engineer.ru/graficheskie-biblioteki-s/
  • http://habr.com/post/331564/
  • http://progtips.ru/biblioteki/13-bibliotek-s-o-kotoryx-nuzhno-znat.html
  • http://ru.cppreference.com/w/cpp/header
  • http://fb.ru/article/374020/standartnyie-biblioteki-c
  • http://younglinux.info/c/library