PKG_CONFIG_PATH ortam değişkeni


74

Standart olmayan bir önekte yazılım yüklediyseniz PKG_CONFIG_PATH ortam değişkenini ayarlamayı düşünün. Ne anlama geliyor ?


1
PKG_CONFIG_PATH ortam değişkeninin doğru kullanımı için örnekler sormuş olmanız dışında, "bu nedir ve nasıl kullanırım?" Size söylemeye çalıştığınız cevaplar bu gibi görünüyor. ./Configure sırasında bağımlılıkları bulamadığında bu gösteriyi çok buluyorum.
Douglas G. Allen

Yanıtlar:


68

PKG_CONFIG_PATHpkg-config.pc dosyalarını arayacak ek yolları belirten bir ortam değişkenidir .

Bu değişken, pkg-config'nin varsayılan arama yolunu artırmak için kullanılır. Tipik bir Unix sisteminde, dizinlerde /usr/lib/pkgconfigve /usr/share/pkgconfig. Bu genellikle sisteme takılan modülleri kapsayacaktır. Ancak, bazı yerel modüller gibi farklı bir ön eke takılabilir /usr/local. Bu durumda, pkg-config'in .pc dosyalarını bulabilmesi için arama yolunu hazırlamak gerekir.

pkg-configProgram sistemde yüklü kütüphaneler hakkında bilgi almak için kullanılır. Birincil kullanımı, pkg-configbir programı bir kütüphaneye derlemek ve bağlamak için gerekli detayları sağlamaktır. Bu meta veriler pkg-config dosyalarında depolanır. Bu dosyalar .pc sonekine sahiptir ve pkg-config aracı tarafından bilinen belirli konumlarda bulunur.

PKG_CONFIG_PATHDeğeri kontrol etmek için bu komutu kullanın:

echo $PKG_CONFIG_PATH

PKG_CONFIG_PATHKullanım değerini ayarlamak için :

export PKG_CONFIG_PATH=/usr/lib/pkgconfig

veya

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

@NathanKidd Hatırlatma için teşekkürler, yorum silindi. Orijinal hata, yine de orijinal olmayan bir yazar düzenlemesinden kaynaklanmış gibi görünüyor.
Timothy Gu

@remram hatalar düzeltildi gibi görünüyor ancak yorumunuz, düzenleme geçmişini dikkatlice incelemiyorlarsa, insanların kafasını karıştırıyor. Şu anki doğruluktan memnun olup olmadığınızı kontrol edebilir ve sonra yorumu silebilir misiniz? (Ve ben mayını sileceğim.)
Nathan Kidd

@ devav2 her iki dışa aktarma komutunda sorunu çözmüyor
Shayan

38

İlk cevap teknik olarak yeterince açık değil. Man sayfasından (bir terminal açın, şunu yazın man pkg-config):

pkg-configÖzel meta veri dosyalarından paketler hakkında bilgi alır. Bu dosyalar paketten sonra adlandırılır ve bir .pcuzantısı vardır. Çoğu sistemde, pkg-config bakar /usr/lib/pkgconfig, /usr/share/pkgconfig, /usr/local/lib/pkgconfigve /usr/local/share/pkgconfigbu dosyalar için. Ayrıca, PKG_CONFIG_PATHortam değişkeni tarafından belirtilen iki nokta üst üste işaretli (Windows'ta noktalı virgülle ayrılmış) dizin listesine bakacaktır .

Yani pkg-configprogram PKG_CONFIG_PATHdizinde değil ; Ancak, bir kitaplık yüklerseniz, bilginin bir automakekomut dosyasında erişilebilir olması için bilginin bir dizinde pkg-configolması gerektiğinin farkında olması gerekir.


Anahtar kelime öbeği "çoğu sistemde" görünüyor. Örneğin Debian'ımda, /usr/local/lib/x86_64-linux-gnuücretsiz (boş PKG_CONFIG_PATH) bir otomatik arama yeri olarak ve .pcGTK + ve ark. - orada yaşa. Bunun nedeni, burada belirtildiği gibi bir paketin aynı anda çok mimarili kullanılabilirliğini sağlamaktır: askubuntu.com/questions/449348/…
underscore_d

(artık düzenleyemezsiniz) @GrandAdmiral, bu sayfada daha ilerideki bir cevabında pkg-config, sisteminizde arama yapacak varsayılan yolları nasıl kontrol edebileceğinizi gösterdi : askubuntu.com/a/373217/436580
underscore_d

35

Pkg-config'nin (sürüm 0.24 veya üstü) varsayılan olarak yüklü kitaplıkları nerede aradığını görmek için aşağıdaki komutu kullanın:

pkg-config --variable pc_path pkg-config

Bu yolu değiştirmek için PKG_CONFIG_PATHortam değişkenini ayarlayın . Adam dosya devletler PKG_CONFIG_PATH:

Sütunla ayrılmış (Windows'ta, noktalı virgülle ayrılmış) .pc dosyalarını aramak için dizin listesi. Varsayılan dizin her zaman yolu aradıktan sonra aranacaktır; varsayılan değer libdir / pkgconfig: datadir / pkgconfig, burada libdir, pkg-config ve datadir öğelerinin, pkg-config'nin kurulu olduğu datadir olduğu libdir'dir.


3
yararlı bir senaryo olacakecho $(pkg-config --variable pc_path pkg-config)${PKG_CONFIG_PATH:+:}${PKG_CONFIG_PATH}
albfan 5:15

5
Bu bana yardımcı oldu harika bir cevap. Bununla birlikte, açıklığa kavuşturmak için "Değiştirmek" yerine "Bu yola eklemek için" demelisiniz, çünkü biri boş olabilir PKG_CONFIG_PATHve hala varsayılan aranan dizinler vardır, ayrıca boş olmayan bir değerin ayarlanması varsayılanları temizlemez.
underscore_d

Bu cevap benim için gerçekten çok faydalı oldu, teşekkürler! Benimki LinuxBew ile kurulduğundan beri pkg-config için varsayılan arama yolunun ne olduğunu bulmaya çalışıyordum, bu yüzden varsayılan yollar mevcut değil. Teşekkürler!
mxplusb

6

Bir yazılım parçası oluşturmaya çalışıyorsunuz, diyelim Widget. Widget başka bir kütüphaneye dayanıyor, tartışma uğruna libcog. Widget'ın oluşturma işlemi (muhtemelen bir config betiği) libcog'un nasıl kullanılacağını belirlemek için pkg-config kullanıyor. pkg-config libcog hakkında hiçbir şey bilmiyor.

Libcog yüklü değilse, bu senin sorunun. Standart bir libcog kurulumunun sorunu çözmesi için iyi bir şans var. Sisteminize bağlı olarak, paketin ek bir "geliştirici" sürümünü kurmanız gerekebilir; sonunda "-devel" veya "-dev" vardır, bu nedenle "libcog" yüklerseniz, "libcog-devel" kurmanız da gerekebilir.

Libcog kuruluysa, muhtemelen pkg-config'nin bulabileceği şekilde kurulmamıştır. Muhtemelen sisteminizde bir yerde bir libcog.pc dosyası var. Argüman uğruna, /opt/cog/lib/pkgconfig/libcog.pc adresinde bulunur. Bu durumda, PKG_CONFIG_PATH'yi libcog.pc tutan dizine ayarlayarak pkg-config komutunu anlatabilirsiniz. Yani bir Bourne kabuğundaki veya benzeri bir şey

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

Bir kez bittiğinde, başarısız olan komutu tekrar çalıştırmak umarım işe yarayacaktır.

Kitaplıklar ve başlık dosyaları dahil olmak üzere libcog kuruluysa ve bir libcog.pc dosyanız yoksa, işler kötü gidiyor. Muhtemelen standart bir libcog kurulum bilgisi içerir, yoksa Widget ona güvenmezdi. İlk önce libcog'u yeniden yükleyeceğim. Libcog.pc dosyasını el ile oluşturmak mümkündür, ancak doğru bir şekilde elde etmek belirli bir kitaplığa zor ve oldukça spesifiktir.


4
Yine de bir şey - peki PKG_CONFIG_PATH tanımlanmışsa - bu doğru yazacak mı?
NoBugs

1
@ NoBugs iyi yakalamak, bunun yerine eklemek için cevabı (birkaç yıl sonra!) Düzenledim.
Joe Malt

5

64 bit sistemimin kılavuz sayfasına baktım ve kafam biraz karıştı. Tek satırda şöyle dedi:

pkg-config, özel meta veri dosyalarından paketler hakkında bilgi alır. Bu dosyalar paketin arkasına .pc uzantılı adlandırılır. Varsayılan olarak, pkg-config bu dosyalar için dizin önekine / lib / pkgconfig'e bakar; ayrıca, PKG_CONFIG_PATH ortam değişkeni tarafından belirtilen dizinlerin sütunla ayrılmış (Windows'ta noktalı virgülle ayrılmış) dizin listesine bakacaktır.

Bunun lib / pkgconfig dizinlerine baktığını sanmıştım. Dizinleri kendileri kapatır. Benim durumumda, merhaba dünya gtk öğreticisini derlemeye çalışıyordum. Örneğin istediğim dosyayı buldum

locate gtk | grep '\.pc'

Sonuçlar arasında:

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

Sonunda bir ihracat yapmaktı.

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

1
manModern, çoklu mimariye sahip sistemler için sayfanın nasıl basitleştirildiğini gösteren +1 . Bir süredir kafam karıştı, çünkü Debian 8 x86'da, pkg-configzaten x86_64 klasöründe (hiçbir şey olmadan PKG_CONFIG_PATH) görünüyor. Bunun nasıl birleştirildiğinden emin değilim, ancak @GrandAdmiral tarafından gösterilen bunu sorgulayan komut satırı, kendi paketi --variable pc_pathiçin ayarlanmış (bir şekilde!) Tarafından kontrol edildiğini gösteriyor pkg-config.
underscore_d

5

Bana öyle geliyor ki cevapların çoğunda gereğinden fazla bilgi var.

Birinin yüklediği yazılım (ve genellikle yapar) bazı kütüphanelere ve / veya başlıklara dayanabilir ve Sistem onları bulmak için pkg-config kullanır.

Demek ki, pkg-configbu dosyaları önceden tanımlanmış (varsayılan) sistemin dizinlerinde arar. Bu klasörler "önek" dir. Örneğin öneki /usr/localolan bir kütüphanenin başlıkları olması beklenir /usr/local/includeve kütüphanenin kendisi de içinde olacaktır /usr/local/lib. Ancak pkg-config , PKG_CONFIG_PATH ortam değişkeninde listelenen dizindeki kütüphaneleri de arar .

Ardından, varsayılan klasör listesinin dışına yazılım yüklerseniz, listeyi "ayarlamanız" gerekir, yani dizinlerinizi PKG_CONFIG_PATH dizinine ekleyin.

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

Daha fazla bilgi için buraya ve buraya bakabilirsiniz.


PKG_CONFIG_PATHsadece yourPkg.pc ( pkg-configşartname) dosyaların aranacağı ek dizinleri belirtir . Kütüphane arama dizinleri gibi pkg'ye özgü şeyleri etkilemez.
underscore_d

1

Kaynağından bir şeyler inşa etmeye çalışıyorsunuz ve ihtiyaç duyduğu tüm bağımlılıkları bulamıyor. Bu pkg-configkütüphanelerin geliştirme dosyalarını bulmak için kullandığı komut dosyası bu mesajı çıkarır.


0

Axel'in en son sürümünü kurmaya çalışıyordum ve koştum ./configureve şunu anladım:

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.

Bu yüzden denedim:

$ pkg-config --cflags openssl

ve anladım:

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

Açıkça belli ki openssl kurdum ( sudo apt-get install openssl) Ama yukarıdaki çıktıda gördüğünüz gibi "Hiçbir paket 'openssl' bulunamadı" ifadesini kullandı. Yaptığımdan emin olmak için:

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

Kesinlikle başka bir pakete ihtiyacım var, bu yüzden biraz googling ve bu paketi kurmak zorunda olduğumu öğrendim:

sudo apt-get install libssl-dev

Bütün bunların pkg-config path env değişkenini değiştirmeyle ilgisi yoktu.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.