1. 程式人生 > >Linux的pkg-config命令

Linux的pkg-config命令

文章作者:Tyan
部落格:noahsnail.com  |  CSDN  |  簡書

1. pkg-config介紹

pkg-config是一個在原始碼編譯時查詢已安裝的庫的使用介面的計算機工具軟體。pkg-config原本是設計用於Linux的,但現在在各個版本的BSD、windows、Mac OS X和Solaris上都有著可用的版本。
它輸出已安裝的庫的相關資訊,包括:1. C/C++編譯器需要的輸入引數;2. 連結器需要的輸入引數;3. 已安裝軟體包的版本資訊。

當安裝一個庫時(例如從RPM,deb或其他二進位制包管理系統),會包括一個字尾名為pc的檔案,它會放入某個資料夾下(依賴於你的系統設定)。例如,在Linux為該軟體的庫檔案所在資料夾lib之下的子資料夾pkgconfig。把該子資料夾加入pkg-config的環境變數PKG_CONFIG_PATH作為搜尋路徑,例如在bash配置檔案中加入:

$ export PKG_CONFIG_PATH=/usr/local/庫名字/lib/pkgconfig:$PKG_CONFIG_PATH

在這個.pc檔案裡包含有數個條目。這些條目通常包含用於其他使用這個庫的程式編譯時需要的庫設定,以及標頭檔案的位置,版本資訊和一個簡介。以OpenCV為例,在Mac上pkgconfig目錄所在的路徑為:/usr/local/Cellar/opencv3/3.1.0_4/lib/pkgconfig/,目錄下的.pc檔案為opencv.pc,其內容為:

# Package Information for pkg-config

prefix=/usr/local/Cellar/opencv3/3.1
.0_4 exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir_old=${prefix}/include/opencv includedir_new=${prefix}/include Name: OpenCV Description: Open Source Computer Vision Library Version: 3.1.0 Libs: -L${exec_prefix}/lib -lopencv_shape -lopencv_stitching -lopencv_objdetect -lopencv_superres -lopencv_videostab -lippicv -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml -lopencv_imgproc -lopencv_flann -lopencv_core Libs.private: -framework OpenCL -framework Cocoa -L/usr/local/opt/jpeg/lib -ljpeg -L/usr/local/lib -lwebp -lpng -ltiff -l
Imath -lIlmImf -lIex -lHalf -lIlmThread -L/usr/lib -lz -framework QTKit -framework QuartzCore -framework AppKit Cflags: -I${includedir_old} -I${includedir_new}

2. pkg-config的使用

在Linux/Mac系統下編寫C、C++程式時,編譯時需要包含標頭檔案,連結時需要庫檔案,但安裝一些第三方庫之後不知道對應的include檔案和lib檔案的位置,此時就需要pkg-config了。以opencv為例:

  • 檢視標頭檔案位置
# 命令形式:pkg-config --cflags software_name

# demo
$ pkg-config --cflags opencv
-I/usr/local/Cellar/opencv3/3.1.0_4/include/opencv -I/usr/local/Cellar/opencv3/3.1.0_4/include
  • 檢視lib庫的位置
# 命令形式:pkg-config --libs software_name

# demo
$ pkg-config --libs opencv
-L/usr/local/Cellar/opencv3/3.1.0_4/lib -lopencv_shape -lopencv_stitching -lopencv_objdetect -lopencv_superres -lopencv_videostab -lippicv -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml -lopencv_imgproc -lopencv_flann -lopencv_core
  • 編譯程式,編譯DispalyImage.cpp檔案

DispalyImage.cpp檔案內容為:

#include<iostream>
#include<opencv2/opencv.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/core.hpp>
using namespace std;
using namespace cv;
int main()
{
    Mat img = imread("./lena.bmp");
    if(!img.data)
    {
        return -1;
    }
    namedWindow("Lena", CV_WINDOW_AUTOSIZE);
    imshow("Lena", img);
    waitKey();
    return 0;
}

編譯,連結生成可執行程式DisplayImage:

$ g++ -o DisplayImage $(pkg-config --cflags --libs opencv) DisplayImage.cpp

執行結果:

Lena

參考資料: