Переменная окружения PKG_CONFIG_PATH


74

Рассмотрите возможность настройки переменной среды PKG_CONFIG_PATH, если вы установили программное обеспечение с нестандартным префиксом. Что это значит ?


1
Я бы почти спросил об этом точно так же, за исключением того, что вы могли бы попросить примеры правильного использования переменной среды PKG_CONFIG_PATH, например, "что это такое и как я могу это использовать?" Кажется, что ответы, которые вы получили, пытались сказать вам это. Я часто нахожу это шоу во время ./configure, когда не удается найти зависимости.
Дуглас Г. Аллен

Ответы:


68

PKG_CONFIG_PATHпеременная окружения, которая указывает дополнительные пути, по которым pkg-configбудут выполняться поиск файлов .pc

Эта переменная используется для дополнения пути поиска по умолчанию в pkg-config. В типичной системе Unix, он будет искать в каталогах /usr/lib/pkgconfigи /usr/share/pkgconfig. Это обычно покрывает установленные модули системы. Однако некоторые локальные модули могут быть установлены с другим префиксом, например /usr/local. В этом случае необходимо предварительно указать путь поиска, чтобы pkg-config могла найти файлы .pc.

pkg-configПрограмма используется для получения информации об установленных библиотек в системе. Основное назначение pkg-config- предоставить необходимую информацию для компиляции и связывания программы с библиотекой. Эти метаданные хранятся в файлах pkg-config. Эти файлы имеют суффикс .pc и находятся в определенных местах, известных инструменту pkg-config.

Чтобы проверить PKG_CONFIG_PATHзначение, используйте эту команду:

echo $PKG_CONFIG_PATH

Для установки PKG_CONFIG_PATHзначения используйте:

export PKG_CONFIG_PATH=/usr/lib/pkgconfig

или же

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

@NathanKidd Спасибо за напоминание, комментарий удален. Первоначальная ошибка, похоже, была вызвана не оригинальным авторским редактированием.
Тимоти Гу

@remram похоже, что ошибки сейчас исправлены, но ваш комментарий оставляет людей в замешательстве, если они не внимательно изучают историю редактирования. Не могли бы вы проверить, довольны ли вы текущей точностью, и, возможно, удалить комментарий? (И я удалю мою.)
Натан Кидд

@ devav2 обе команды экспорта не решают проблему
Shayan

38

Первый ответ не является технически достаточно явным. На странице руководства (откройте терминал, введите man pkg-config):

pkg-configизвлекает информацию о пакетах из специальных файлов метаданных. Эти файлы названы в честь пакета и имеют .pcрасширение. В большинстве систем, pkg-config выглядит /usr/lib/pkgconfig, /usr/share/pkgconfig, /usr/local/lib/pkgconfigи /usr/local/share/pkgconfigдля этих файлов. Кроме того, он будет выглядеть в списке каталогов, разделенных двоеточиями (в Windows, разделенных точкой с запятой), указанных в PKG_CONFIG_PATHпеременной среды.

Таким образом, pkg-configпрограмма не находится в PKG_CONFIG_PATHкаталоге; однако, если вы устанавливаете библиотеку, информация о том, чтобы использовать ее в automakeсценарии, была доступна, и она должна находиться в каталоге pkg-config.


Ключевая фраза, как представляется, «в большинстве систем». Например, в моем Debian мы /usr/local/lib/x86_64-linux-gnuавтоматически добавляем в качестве места автоматического поиска (с пустым PKG_CONFIG_PATH) и, действительно, множество .pcфайлов, в том числе GTK + et al. - жить есть. Причина этого заключается в одновременном включении доступности нескольких архитектур для пакета, как описано здесь: askubuntu.com/questions/449348/…
underscore_d

(больше не может редактировать) @GrandAdmiral в ответе ниже на этой странице показано, как проверить пути по умолчанию pkg-configдля поиска в вашей системе: askubuntu.com/a/373217/436580
underscore_d

35

Чтобы узнать, где pkg-config (версия 0.24 или новее) ищет установленные библиотеки по умолчанию, используйте следующую команду:

pkg-config --variable pc_path pkg-config

Чтобы изменить этот путь, установите PKG_CONFIG_PATHпеременную среды. Man-файл гласит PKG_CONFIG_PATH:

Разделенный двоеточиями (в Windows, разделенный точкой с запятой) список каталогов для поиска файлов .pc. Каталог по умолчанию всегда будет искать после поиска пути; по умолчанию это libdir / pkgconfig: datadir / pkgconfig, где libdir - это libdir, где pkg-config и datadir - это каталог данных, где был установлен pkg-config.


3
полезный скрипт будетecho $(pkg-config --variable pc_path pkg-config)${PKG_CONFIG_PATH:+:}${PKG_CONFIG_PATH}
альбфан

5
Это отличный ответ, который помог мне. Однако, чтобы уточнить, вы должны сказать «Добавить к этому пути», а не «Чтобы изменить», так как можно иметь пустые PKG_CONFIG_PATHи все еще иметь каталоги по умолчанию, плюс установка непустого значения не сбрасывает значения по умолчанию.
underscore_d

Этот ответ был действительно полезен для меня, спасибо! Я пытался выяснить, каким был путь поиска по умолчанию для pkg-config, так как мой установлен с Linuxbrew, поэтому пути по умолчанию не существует. Спасибо!
mxplusb

6

Вы пытаетесь создать часть программного обеспечения, скажем, Widget. Виджет опирается на другую библиотеку, libcog ради аргумента. Процесс сборки виджета (возможно, скрипт configure) использует pkg-config, чтобы определить, как использовать libcog. pkg-config ничего не знает о libcog.

Если libcog не установлен, это ваша проблема. Есть большая вероятность, что стандартная установка libcog решит проблему. В зависимости от вашей системы вам может потребоваться установить дополнительную версию пакета для разработчиков; он часто имеет «-devel» или «-dev» в конце, поэтому, если вы устанавливаете «libcog», вам также может понадобиться установить «libcog-devel».

Если libcog установлен, он, вероятно, установлен не так, чтобы pkg-config могла его найти. Вероятно, где-то в вашей системе есть файл libcog.pc. Ради аргумента, это в /opt/cog/lib/pkgconfig/libcog.pc. В этом случае вы можете сообщить об этом pkg-config, установив PKG_CONFIG_PATH в каталог, содержащий libcog.pc. Так что в оболочке Борна или аналогичной, что-то вроде

export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/opt/cog/lib/pkgconfig/

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

Если установлен libcog, включая библиотеки и заголовочные файлы, а у вас нет файла libcog.pc, дела идут плохо. Предположительно стандартная установка libcog включает в себя информацию, иначе Widget не будет полагаться на нее. Я бы сначала расследовал переустановку libcog. Можно вручную создать файл libcog.pc, но сделать его правильно сложно и очень специфично для данной библиотеки.


4
Одна вещь, хотя - что, если PKG_CONFIG_PATH определен - это перезапишет это правильно?
NoBugs

1
Хороший улов @NoBugs, я отредактировал ответ (несколько лет спустя!), Чтобы добавить его.
Джо Мальт

5

Я посмотрел на man-страницу моей 64-битной системы и немного запутался. В одной строке сказано:

pkg-config извлекает информацию о пакетах из специальных файлов метаданных. Эти файлы названы в честь пакета с расширением .pc. По умолчанию pkg-config ищет в этих файлах префикс директории / lib / pkgconfig; он также будет смотреть в списке каталогов, разделенных двоеточиями (в Windows, разделенных точкой с запятой), указанных переменной среды PKG_CONFIG_PATH.

Я предполагал, что это всегда выглядит в каталогах lib / pkgconfig. Оказывается это сами каталоги. В моем случае я пытался скомпилировать учебник Hello World GTK. Я нахожу файл, который я хочу, например

locate gtk | grep '\.pc'

Среди результатов:

/usr/lib/x86_64-linux-gnu/pkgconfig/gtk+-3.0.pc

Наконец-то должен был сделать экспорт.

export PKG_CONFIG_PATH=/usr/lib/x86_64-linux-gnu/pkgconfig/

1
+1 за указание на то, как manстраница упрощается для современных систем с множественной архитектурой. Я растерялась на некоторое время , потому что, на Debian 8 x86, pkg-configуже ищет в папке x86_64 (без чего - либо в PKG_CONFIG_PATH). Я не уверен, как это было включено, но командная строка для проверки этого, показанная @GrandAdmiral, указывает, что он контролируется тем, --variable pc_pathчто установлено (каким-то образом!) Для pkg-configсобственного пакета.
underscore_d

5

Мне кажется, что большинство ответов содержат слишком много информации, чем необходимо.

Программное обеспечение, которое устанавливается, может (и обычно делает) полагаться на некоторые библиотеки и / или заголовки, и Система использует pkg-config для их поиска.

Сказал так, pkg-configищет эти файлы в предопределенных (по умолчанию) системных каталогов. Эти папки являются "префиксом". Например, /usr/localожидается, что библиотека с префиксом будет иметь заголовки /usr/local/include, а сама библиотека будет /usr/local/lib. Однако pkg-config ищет библиотеки также в каталоге, указанном в переменной окружения PKG_CONFIG_PATH .

Затем, если вы устанавливаете программное обеспечение вне списка папок по умолчанию, вам нужно было «настроить» этот список, а именно добавить каталоги в PKG_CONFIG_PATH.

$ export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:<your-directory>

Для получения дополнительной информации вы можете посмотреть здесь и здесь


PKG_CONFIG_PATHуказывает дополнительные каталоги, в которых нужно искать только файлы yourPkg.pc( pkg-configспецификации). Это не влияет на такие специфичные для pkg вещи, как каталоги поиска в библиотеке.
underscore_d

1

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


0

Я пытался установить последнюю версию акселя, и я побежал, ./configureи я получил это:

configure: error: Package requirements (openssl) were not met:

No package 'openssl' found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables SSL_CFLAGS
and SSL_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.

Итак, я попробовал:

$ pkg-config --cflags openssl

и я получил:

Package openssl was not found in the pkg-config search path.
Perhaps you should add the directory containing `openssl.pc'
to the PKG_CONFIG_PATH environment variable
No package 'openssl' found

Как очевидно, я установил openssl ( sudo apt-get install openssl) Но на вышеприведенном выводе, как вы можете видеть, говорится: «Пакет openssl не найден». Итак, чтобы убедиться, что я сделал:

find / -type f -name "*.pc" |& grep -iv permission | grep openssl

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

sudo apt-get install libssl-dev

И все это не имело никакого отношения к изменению переменной env пути pkg-config.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.