ตัวแปรสภาวะแวดล้อม PKG_CONFIG_PATH


74

พิจารณาปรับตัวแปรสภาพแวดล้อม PKG_CONFIG_PATH หากคุณติดตั้งซอฟต์แวร์ในคำนำหน้าที่ไม่ได้มาตรฐาน สิ่งนี้หมายความว่า ?


1
ฉันเกือบจะถามด้วยวิธีเดียวกันยกเว้นคุณอาจขอตัวอย่างของการใช้ตัวแปรสภาพแวดล้อม PKG_CONFIG_PATH ที่เหมาะสมเช่น "มันคืออะไรและฉันจะใช้มันอย่างไร" ดูเหมือนว่าคำตอบที่คุณได้พยายามที่จะบอกคุณนี้ ฉันพบการแสดงนี้มากในช่วง. / กำหนดค่าเมื่อล้มเหลวในการค้นหาการอ้างอิง
Douglas G. Allen

คำตอบ:


68

PKG_CONFIG_PATHเป็นตัวแปรสภาพแวดล้อมที่ระบุเส้นทางเพิ่มเติมซึ่งpkg-configจะค้นหาไฟล์. pc

ตัวแปรนี้ใช้เพื่อเพิ่มพา ธ การค้นหาดีฟอลต์ของ pkg-config บนระบบปฏิบัติการยูนิกซ์ทั่วไปจะค้นหาในไดเรกทอรีและ/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 ขอบคุณสำหรับการเตือนลบความคิดเห็น ข้อผิดพลาดเดิมดูเหมือนว่าจะเป็นผลมาจากการแก้ไขผู้เขียนที่ไม่ใช่ต้นฉบับอยู่แล้ว
Timothy Gu

@remram ดูเหมือนว่าข้อผิดพลาดได้รับการแก้ไขแล้ว แต่ความคิดเห็นของคุณทำให้คนสับสนหากพวกเขาไม่ตรวจสอบประวัติการแก้ไขอย่างระมัดระวัง คุณสามารถตรวจสอบว่าคุณมีความสุขกับความถูกต้องในปัจจุบันและอาจลบความคิดเห็นแล้ว? (และฉันจะลบของฉัน)
นาธาน Kidd

@ 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ตัวแปรสภาพแวดล้อม สถานะไฟล์แมน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และยังมีไดเรกทอรีค้นหาเริ่มต้นรวมทั้งการตั้งค่าที่ไม่ใช่ช่องว่างจะไม่ล้างค่าเริ่มต้น
underscore_d

คำตอบนี้มีประโยชน์กับฉันจริงๆขอบคุณ! ฉันพยายามคิดว่าเส้นทางการค้นหาเริ่มต้นสำหรับ pkg-config คืออะไรเนื่องจากมีการติดตั้งของฉันกับ Linuxbrew ดังนั้นเส้นทางเริ่มต้นจึงไม่มีอยู่ ขอบคุณ!
mxplusb

6

คุณกำลังพยายามสร้างซอฟต์แวร์ชิ้นหนึ่งสมมติว่า Widget วิดเจ็ตอาศัยไลบรารีอื่น 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 ดังนั้นใน Bourne shell หรือคล้ายกัน

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
@ ไม่มีข้อผิดพลาดจับดีฉันได้แก้ไขคำตอบ (หลายปีต่อมา!) เพื่อผนวกมันแทน
Joe Malt

5

ฉันดู man-page บนระบบ 64 บิตของฉันและสับสนเล็กน้อย มันพูดในบรรทัดเดียว:

pkg-config ดึงข้อมูลเกี่ยวกับแพ็กเกจจากไฟล์ข้อมูลเมตาพิเศษ ไฟล์เหล่านี้ตั้งชื่อตามแพ็คเกจที่มีนามสกุล. pc โดยค่าเริ่มต้น pkg-config จะค้นหาในคำนำหน้าไดเร็กตอรี่ / lib / pkgconfig สำหรับไฟล์เหล่านี้; มันจะดูในรายการที่คั่นด้วยโคลอน (บน Windows, คั่นด้วยเครื่องหมายอัฒภาค) ของไดเรกทอรีที่ระบุโดยตัวแปรสภาพแวดล้อม PKG_CONFIG_PATH

ฉันสันนิษฐานว่ามันดูในไดเรกทอรี lib / pkgconfig เปิดออกไดเรกทอรีของตัวเอง ในกรณีของฉันฉันพยายามรวบรวม gtk hello world tutorial ฉันค้นหาไฟล์ที่ต้องการเช่น

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

กลับกลายเป็นว่าฉันต้องการแพคเกจอื่น ๆ อย่างแน่นอนดังนั้น googling เล็กน้อยและฉันพบว่าฉันต้องติดตั้งแพคเกจนี้:

sudo apt-get install libssl-dev

และทั้งหมดนี้ไม่เกี่ยวอะไรกับการเปลี่ยนตัวแปร pkg-config env


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.