2015年3月25日 星期三

用 pkg-config 查詢「設定 Eclipse 使用函式庫 (library)」所需的參數

之前寫過幾篇有關用 Eclipse 開發程式的文章,關於所使用的函式庫(Library)如何正確設定,使得 Eclipse 可以編譯程式、鏈結函數庫以產生『可執行』檔案(:參考篇末文章列表)。
  由於函式庫的發展也會加入新功能,安裝時也可能會因系統不同而放在不同目錄。每次版本有更新,可能就要找一次這些參數的正確設定值,也是一件麻煩的事。
  之前的發文中有一篇提到 Linux 的工具程式 pkg-config,剛好最近要使用新的函式庫開發程式,就對 pkg-config 這個程式深入研究一下。
  一般在使用 Eclipse 開發程式時,有幾個『專案屬性』的設定與函式庫的正確使用有極大關係。在『專案瀏覽器』選擇欲設定的專案,按【滑鼠右鍵】點選選單下方的《內容》,跳出『專案內容』的設定視窗。在左欄的點選《C/C++ Build》→《Setting》,接著在右方『Tool Settings』分頁下方,分別位於
  • 《GCC C Compiler》→《Includes》,在右欄上方的『Include paths (-I)』
  • 《GCC C Linker》→《Libraries》,在右欄上方的『Libraries (-l)』
  • 《GCC C Linker》→《Libraries》,在右欄下方的『Libraries search path (-L)』
這三個地方,其中
  • 第一個參數(-I)是「GCC 編譯器」的參數,指定程式中引用的「標頭檔」目錄。
  • 第二個參數(-l)是「GCC 鏈結器」的參數,指定所引用「函式庫」的所在目錄。
  • 第三個參數(-L)也是「GCC 鏈結器」的參數,指定搜尋所引用「函式庫」目錄的起點。
  上述三個參數都可以用 pkg-config 來查詢,以 OpenCV 這個「函式庫」為例,
查詢第一個參數的命令如下:
[SiB@Celeron-D ~]$ pkg-config --cflags opencv
-I/usr/include/opencv
顯示所引入的「標頭檔」所在目錄為『/usr/include/opencv』,將它填入 Eclipse 就可以了。
查詢第二個參數的命令如下:
[SiB@Celeron-D ~]$ pkg-config --libs-only-l opencv
-lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_features2d -lopencv_flann -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_ml -lopencv_objdetect -lopencv_ocl -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_ts -lopencv_video -lopencv_videostab
這是整個「函式庫」全部的目錄路徑,以訊息『-lopencv_calib3d』來說,實際的路徑要先扣掉前面的『-l』,所以加在 Eclipse 的參數為『opencv_calib3d』,如果沒用那麼多可以不用全加上去。
第三個參數的查詢命令為,
[SiB@Celeron-D ~]$ pkg-config --libs-only-L opencv

這是「函式庫」的搜尋目錄的起點,上例為空白表示不需設定。

查詢錯誤

有時候「函式庫」確實已經安裝,但是在查詢參數時卻又出現錯誤,如下所示:
[SiB@Celeron-D ~]$ pkg-config --libs-only-l xxxx
Package gsl was not found in the pkg-config search path.
Perhaps you should add the directory containing `xxxx.pc'
to the PKG_CONFIG_PATH environment variable
No package 'xxxx' found
發生這種錯誤的原因有兩個:
  • 這個「函式庫」不支援以『pkg-config』查詢參數,如:pthreads。
  • 輸入的「函式庫」名稱(上例為『xxxx』)並不是「函式庫」的正確或完整名稱。可以另一個查詢參數『--list-all』查詢已安裝「函式庫」的正確名稱。
    [SiB@Celeron-D ~]$ pkg-config --list-all
     . . . . .
    opencv              OpenCV - Open Source Computer Vision Library
     . . . . .
    如上例,『opencv』就是正確的「函式庫」名稱,有時名稱會包含版本數字。
若可以查得正確的「函式庫」名稱,則可繼續查詢 Eclipse 專案的設定參數。若仍不知正確的「函式庫」名稱,就要尋求其它辦法。

相關發文:

後記:

  • 2015-3-30: 增補一個查詢「函式庫」名稱的參數『--list-all』。

已測試版本:

  • Fedora 21 + Eclipse 4.4.2 + OpenCV 2.4.9

參考資料:

沒有留言:

張貼留言

感謝你耐心看完本文,歡迎留下任何指正、建議,筆者會儘快回應。(English is also welcome.)