Змінна середовища PKG_CONFIG_PATH


74

Подумайте про коригування змінної середовища PKG_CONFIG_PATH, якщо ви встановили програмне забезпечення у нестандартний префікс. Що це значить ?


1
Я б майже запитав це так само, за винятком того, що ви могли б попросити приклади правильного використання змінної середовища PKG_CONFIG_PATH на кшталт "що це таке і як я ним користуюся?" Схоже, відповіді, які ви отримали, намагалися вам сказати. Я виявляю, що ця вистава виявляється багато під час ./конфігуруйте, коли не вдається знайти залежності.
Дуглас Г. Аллен

Відповіді:


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. Ці файли мають суфікс .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 обидві команди експорту не вирішують проблему
Шаян

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 + та ін. - жити там. Причина цього полягає в тому, щоб одночасно включити доступність пакету для багатьох архітектур, як зазначено тут: 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 - це datadir, де встановлено pkg-config.


3
корисним сценарієм будеecho $(pkg-config --variable pc_path pkg-config)${PKG_CONFIG_PATH:+:}${PKG_CONFIG_PATH}
albfan

5
Це чудова відповідь, яка допомогла мені вийти. Однак для уточнення слід сказати «Додавати до цього шляху», а не «Змінювати», оскільки у нього можуть бути порожні PKG_CONFIG_PATHта все ще мати каталоги, що шукаються за замовчуванням, плюс встановлення непорожнього значення не знімає значення за замовчуванням.
підкреслити_13

Ця відповідь була мені дуже корисна, дякую! Я намагався з’ясувати, який шлях пошуку за замовчуванням для pkg-config був, оскільки мій встановлений з Linuxbrew, тому шляхи за замовчуванням не існують. Дякую!
mxplusb

6

Ви намагаєтеся скласти частину програмного забезпечення, скажімо віджет. За допомогою аргументу віджет покладається на іншу бібліотеку, libcog. Процес збирання віджетів (можливо, сценарій налаштування) використовує 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 включає інформацію, інакше віджет не покладається на неї. Я б спершу дослідив перевстановлення 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власного пакету.
підкреслити_13

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 речі, такі як каталоги пошуку в бібліотеці.
підкреслити_13

1

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


0

Я намагався встановити останню версію axel, і я побіг, ./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

І все це не мало нічого спільного зі зміною змінної pkg-config path env.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.