Biến môi trường PKG_CONFIG_PATH


74

Cân nhắc điều chỉnh biến môi trường PKG_CONFIG_PATH nếu bạn đã cài đặt phần mềm ở tiền tố không chuẩn. Điều đó có nghĩa là gì ?


1
Tôi gần như sẽ hỏi điều này theo cách tương tự ngoại trừ bạn có thể hỏi các ví dụ về cách sử dụng đúng biến môi trường PKG_CONFIG_PATH như "nó là gì và tôi sử dụng nó như thế nào?" Có vẻ như câu trả lời bạn nhận được đang cố nói với bạn điều này. Tôi đang tìm thấy điều này xuất hiện rất nhiều trong ./mình khi không tìm thấy phụ thuộc.
Douglas G. Allen

Câu trả lời:


68

PKG_CONFIG_PATHlà một biến môi trường chỉ định các đường dẫn bổ sung trong đó pkg-configsẽ tìm kiếm các tệp .pc của nó.

Biến này được sử dụng để tăng đường dẫn tìm kiếm mặc định của pkg-config. Trên một hệ thống Unix điển hình, nó sẽ tìm kiếm trong các thư mục /usr/lib/pkgconfig/usr/share/pkgconfig. Điều này thường sẽ bao gồm các mô-đun cài đặt hệ thống. Tuy nhiên, một số mô-đun cục bộ có thể được cài đặt trong một tiền tố khác nhau, chẳng hạn như /usr/local. Trong trường hợp đó, cần phải thêm đường dẫn tìm kiếm để pkg-config có thể định vị các tệp .pc.

Các pkg-configchương trình được sử dụng để lấy thông tin về các thư viện được cài đặt trong hệ thống. Việc sử dụng chính pkg-configlà cung cấp các chi tiết cần thiết để biên dịch và liên kết chương trình với thư viện. Siêu dữ liệu này được lưu trữ trong các tệp pkg-config. Các tệp này có hậu tố .pc và nằm trong các vị trí cụ thể được biết đến với công cụ pkg-config.

Để kiểm tra PKG_CONFIG_PATHgiá trị, sử dụng lệnh này:

echo $PKG_CONFIG_PATH

Để đặt PKG_CONFIG_PATHgiá trị sử dụng:

export PKG_CONFIG_PATH=/usr/lib/pkgconfig

hoặc là

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

@NathanKidd Cảm ơn bạn đã nhắc nhở, bình luận đã bị xóa. Lỗi ban đầu dường như là do một tác giả không phải là tác giả gốc.
Timothy Gu

@remram có vẻ như các lỗi đã được sửa nhưng nhận xét của bạn khiến mọi người bối rối nếu họ không kiểm tra kỹ lịch sử chỉnh sửa. Bạn có thể kiểm tra xem bạn có hài lòng với độ chính xác hiện tại không và có thể xóa bình luận sau đó? (Và tôi sẽ xóa của tôi.)
Nathan Kidd

@ devav2 cả hai lệnh xuất không khắc phục sự cố
Shaya

38

Câu trả lời đầu tiên không đủ rõ ràng về mặt kỹ thuật. Từ trang man (mở terminal, gõ man pkg-config):

pkg-configlấy thông tin về các gói từ các tệp siêu dữ liệu đặc biệt. Các tệp này được đặt tên theo gói và có .pcphần mở rộng. Trên hầu hết các hệ thống, pkg-config trông trong /usr/lib/pkgconfig, /usr/share/pkgconfig, /usr/local/lib/pkgconfig/usr/local/share/pkgconfigcho những tập tin này. Nó cũng sẽ tìm trong danh sách các thư mục được phân tách bằng dấu hai chấm (trên Windows, được phân tách bằng dấu chấm phẩy) được chỉ định bởi PKG_CONFIG_PATHbiến môi trường.

Vì vậy, pkg-configchương trình không có trong PKG_CONFIG_PATHthư mục; tuy nhiên, nếu bạn cài đặt một thư viện, để thông tin sử dụng nó trong một automaketập lệnh có thể truy cập được, nó cần phải có trong một thư pkg-configmục.


Cụm từ chính dường như là "trên hầu hết các hệ thống". Chẳng hạn, trên Debian của tôi, chúng tôi được /usr/local/lib/x86_64-linux-gnuđưa vào như một vị trí tìm kiếm tự động miễn phí (có trống PKG_CONFIG_PATH) và thực sự, rất nhiều .pctệp - đáng chú ý bao gồm GTK + et al. - Sống tại đó. Lý do cho điều này là để kích hoạt tính sẵn có đa kiến ​​trúc của một gói, như được nêu ở đây: askubfox.com/questions/449348/ Kẻ
underscore_d

(không thể chỉnh sửa nữa) @GrandAdmiral trong một câu trả lời tiếp tục xuống trang này cho thấy làm thế nào để kiểm tra các đường dẫn mặc định mà pkg-configsẽ tìm kiếm trên hệ thống của bạn: askubuntu.com/a/373217/436580
underscore_d

35

Để xem nơi pkg-config (phiên bản 0.24 trở lên) tìm kiếm các thư viện đã cài đặt theo mặc định, hãy sử dụng lệnh sau:

pkg-config --variable pc_path pkg-config

Để sửa đổi đường dẫn đó, đặt PKG_CONFIG_PATHbiến môi trường. Các tập tin người đàn ông PKG_CONFIG_PATHlà:

Danh sách các thư mục được phân tách bằng dấu hai chấm (trên Windows, dấu chấm phẩy) để tìm kiếm tệp .pc. Thư mục mặc định sẽ luôn được tìm kiếm sau khi tìm kiếm đường dẫn; mặc định là libdir / pkgconfig: datadir / pkgconfig trong đó libdir là libdir trong đó pkg-config và datadir là datadir nơi pkg-config được cài đặt.


3
một kịch bản hữu ích sẽ làecho $(pkg-config --variable pc_path pkg-config)${PKG_CONFIG_PATH:+:}${PKG_CONFIG_PATH}
albfan 5/03/2015

5
Đây là một câu trả lời tuyệt vời đã giúp tôi ra ngoài. Tuy nhiên, để làm rõ, bạn nên nói "Để thêm vào đường dẫn đó", thay vì "Để sửa đổi", vì người ta có thể để trống PKG_CONFIG_PATHvà vẫn có các thư mục được tìm kiếm mặc định, cộng với việc đặt giá trị không trống sẽ không xóa mặc định.
gạch dưới

Câu trả lời này thực sự hữu ích với tôi, cảm ơn! Tôi đã cố gắng tìm ra đường dẫn tìm kiếm mặc định cho pkg-config là gì vì tôi đã cài đặt Linuxbrew, vì vậy các đường dẫn mặc định không tồn tại. Cảm ơn!
mxplusb

6

Bạn đang cố gắng xây dựng một phần mềm, giả sử Widget. Widget dựa vào một thư viện khác, libcog vì mục đích tranh luận. Quá trình xây dựng của widget (có thể là tập lệnh cấu hình) đang sử dụng pkg-config để xác định cách sử dụng libcog. pkg-config không biết gì về libcog.

Nếu libcog không được cài đặt, đó là vấn đề của bạn. Có một cơ hội tốt rằng một bản cài đặt libcog tiêu chuẩn sẽ khắc phục vấn đề. Tùy thuộc vào hệ thống của bạn, bạn có thể cần cài đặt phiên bản "nhà phát triển" bổ sung của gói; cuối cùng nó thường có "-devel" hoặc "-dev", vì vậy nếu bạn cài đặt "libcog", bạn cũng có thể cần phải cài đặt "libcog-devel".

Nếu libcog được cài đặt, có lẽ nó không được cài đặt theo cách mà pkg-config có thể tìm thấy nó. Có lẽ có một tập tin libcog.pc ở đâu đó trên hệ thống của bạn. Để tranh luận, đó là tại /opt/cog/lib/pkgconfig/libcog.pc. Trong trường hợp đó, bạn có thể nói với pkg-config về nó bằng cách đặt PKG_CONFIG_PATH vào thư mục chứa libcog.pc. Vì vậy, trong một vỏ Bourne hoặc tương tự, một cái gì đó như

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

Khi đã xong, chạy lại lệnh không thành công sẽ hy vọng hoạt động.

Nếu libcog được cài đặt, bao gồm các thư viện và tệp tiêu đề và bạn không có tệp libcog.pc, mọi thứ sẽ trở nên tồi tệ. Có lẽ một bản cài đặt libcog tiêu chuẩn bao gồm thông tin, nếu không thì Widget sẽ không dựa vào nó. Trước tiên tôi muốn điều tra cài đặt lại libcog. Có thể tự tạo tệp libcog.pc, nhưng làm cho đúng thì rất khó và đặc biệt cao đối với một thư viện nhất định.


4
Mặc dù vậy, một điều - nếu PKG_CONFIG_PATH được xác định - điều này sẽ ghi đè lên chính xác thì sao?
NoBugs

1
@NoBugs bắt tốt, tôi đã chỉnh sửa câu trả lời (vài năm sau!) Để nối nó thay thế.
Joe Malt

5

Tôi nhìn vào trang con người trên hệ thống 64 bit của mình và có một chút bối rối. Nó nói trong một dòng:

pkg-config lấy thông tin về các gói từ các tệp siêu dữ liệu đặc biệt. Các tệp này được đặt tên theo gói, với phần mở rộng .pc. Theo mặc định, pkg-config tìm trong tiền tố direc / lib / pkgconfig cho các tệp này; nó cũng sẽ tìm trong danh sách các thư mục được phân tách bằng dấu hai chấm (trên Windows, được phân tách bằng dấu chấm phẩy) được chỉ định bởi môi trường PKG_CONFIG_PATH có thể thay đổi.

Tôi đã giả định rằng nó luôn luôn nhìn vào thư mục lib / pkgconfig. Hóa ra các thư mục của chính nó. Trong trường hợp của tôi, tôi đã cố gắng biên dịch hướng dẫn gtk hello world. Tôi định vị tập tin tôi muốn, vd

locate gtk | grep '\.pc'

Trong số các kết quả là:

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

Cuối cùng là xuất khẩu.

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

1
+1 để chỉ ra cách mantrang này quá đơn giản cho các hệ thống hiện đại, có nhiều kiến ​​trúc. Tôi đã bối rối trong một thời gian bởi vì, trên Debian 8 x86, pkg-configđã tìm trong thư mục x86_64 (không có gì trong PKG_CONFIG_PATH). Tôi không chắc cách này được kết hợp, nhưng dòng lệnh để thăm dò điều này được hiển thị bởi @GrandAdmirus cho thấy nó được điều khiển bởi gói --variable pc_pathđược đặt (bằng cách nào đó!) Cho pkg-configgói riêng.
gạch dưới

5

Dường như với tôi rằng hầu hết các câu trả lời có quá nhiều thông tin cần thiết.

Phần mềm mà một người cài đặt có thể (và thường không) dựa vào một số thư viện và / hoặc tiêu đề và Hệ thống sử dụng pkg-config để tìm chúng.

Nói như vậy, hãy pkg-configtìm các tệp này trong các thư mục của hệ thống được xác định trước (mặc định). Những thư mục đó là "tiền tố". Ví dụ: một thư viện có tiền tố /usr/localdự kiến ​​sẽ có các tiêu đề /usr/local/includevà chính thư viện sẽ ở trong đó /usr/local/lib. pkg-config tuy nhiên cũng tìm các thư viện trong thư mục được liệt kê trong biến môi trường PKG_CONFIG_PATH .

Sau đó, nếu bạn cài đặt phần mềm bên ngoài danh sách thư mục mặc định, bạn phải "điều chỉnh" danh sách, cụ thể là thêm thư mục của bạn vào PKG_CONFIG_PATH

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

Để biết thêm thông tin, bạn có thể xem tại đâyđây


PKG_CONFIG_PATHxác định thư mục bổ sung, trong đó để tìm kiếm chỉ yourPkg.pc ( pkg-configđặc điểm kỹ thuật) tập tin. Nó không ảnh hưởng đến những thứ cụ thể pkg như thư mục tìm kiếm thư viện.
gạch dưới

1

Điều đó có nghĩa là bạn đang cố gắng xây dựng một cái gì đó từ nguồn và nó không thể tìm thấy tất cả các phụ thuộc mà nó cần. Các pkg-configkịch bản nó sử dụng để tìm các tập tin phát triển cho các thư viện, kết quả đầu ra thông báo này.


0

Tôi đã cố gắng cài đặt phiên bản mới nhất của axel và tôi đã chạy ./configurevà tôi đã nhận được điều này:

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.

Vì vậy, tôi đã cố gắng:

$ pkg-config --cflags openssl

và tôi đã nhận được:

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

Rõ ràng là tôi đã cài đặt openssl ( sudo apt-get install openssl) Nhưng trên đầu ra ở trên như bạn có thể thấy nó ghi "Không tìm thấy gói 'openssl'". Vì vậy, để chắc chắn rằng tôi đã làm:

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

Hóa ra tôi cần một số gói khác cho chắc chắn, vì vậy một chút googling và tôi thấy rằng tôi phải cài đặt gói này:

sudo apt-get install libssl-dev

Và tất cả điều này không có gì để làm với việc thay đổi biến env pkg-config.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.