# Работа с библиотеками

## pkg-config 

`pkg-config` является системой управления флагами компилятора и компоновщика, которые используются утилитами `automake` и `autoconf` при создании библиотек:

```sh
pkg-config --libs libpq
```

вывод:

```sh
-lpq
```
где `-lpq` - флаг компиляции при использовании библиотеки `pq` PostgreSQL.

|Флаг|Описание|
|-|-|
|`--list-all`|Вывести список всех установленных общих библиотек|
|`--cflags [БИБЛИОТЕКА]`|Перечисляет флаги предварительной обработки и компиляции для указанной общей библиотеки|
|`--libs [БИБЛИОТЕКА]`|Перечисляет флаги ссылок для указанной общей библиотеки|

### Идентификация библиотеки

После того, как файл библиотеки скомпилирован, в каталоге `{instal_home/lib}` будет создан каталог с именем `pkgconfig`, который содержит файл `.pc` связанной библиотеки. Этот файл содержит соответствующую информацию о модификации библиотеки. Чтобы найти и прочитать, необходимо установить файл `.pc` в каталог `/usr/lib/pkgconfig` или добавить путь установки файла `.pc` в переменную среды `PKG_CONFIG_PATH`. Цель этого - позволить другим программам, которые зависят от этой библиотеки, автоматически связывать библиотеку с помощью `pkg-config`, избегая ошибок во время компиляции.

#### Структура файла `.pc`

```sh
prefix=/usr/local
exec_prefix=${prefix}
includedir=${prefix}/include
libdir=${exec_prefix}/lib

Name: foo
Description: The foo library
Version: 1.0.0
Cflags: -I${includedir}/foo
Libs: -L${libdir} -lfoo
```

[Подробнее](https://people.freedesktop.org/~dbn/pkg-config-guide.html).

Переменная окружения `PKG_CONFIG_PATH` используется для указания пути, где `pkg-config` ищет файлы `.pc`. Кроме того, `pkg-config` также будет искать файлы `.pc` в каталоге `/usr/lib/pkgconfig`.

Установка:

```sh
export PKG_CONFIG_PATH=/usr/local/lib
```

## ldd

Команда `ldd` предназначена для вызова одноименной утилиты, осуществляющей вывод списка разделяемых библиотек, используемых исполняемыми файлами или разделяемыми библиотеками:

```sh
ldd /bin/ls
```

вывод:

```sh
linux-vdso.so.1 (0x00007ffc0b13c000)
libc.so.6 => /usr/lib/haswell/libc.so.6 (0x00007f81723da000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007f817263f000)
```
