1. 程式人生 > >gcc/g++使用第三方庫時新增標頭檔案路徑和庫檔案路徑的方法

gcc/g++使用第三方庫時新增標頭檔案路徑和庫檔案路徑的方法

本文總結了使用第三方庫函式時將其路徑告訴編譯器(gcc和g++同理)的2種常用方式,並舉例說明了每種方式的具體用法。

方法一:在編譯自己的專案時新增-L和-I編譯選項
1)新增標頭檔案路徑:
-I     #指明標頭檔案的路徑

2)新增庫檔案路徑:
-L    #指定目錄。link的時候,去找的目錄。gcc會先從-L指定的目錄去找,然後才查詢預設路徑。(告訴gcc,-l庫名最可能在這個目錄下)。
-l     #指定檔案(庫名),linking options

注:-l緊接著就是庫名,這裡的庫名不是真正的庫檔名。比如說數學庫,它的庫名是m,他的庫檔名是libm.so。再比如說matlab eigen庫,它的庫名是eng,它的庫檔名是libeng.so。很容易總結得:把庫檔名的頭lib和尾.so去掉就是庫名了。在使用時,“-leng”就告訴gcc在連結階段引用共享函式庫libeng.so。



方法二:將庫路徑新增到環境變數
1)新增標頭檔案路徑:

在/etc/profile中新增(根據語言不同,任選其一):
export C_INCLUDE_PATH=C_INCLUDE_PATH:標頭檔案路徑                             #c
export CPLUS_INCLUDE_PATH=CPLUS_INCLUDE_PATH:標頭檔案路徑        #c++
export OBJC_INCLUDE_PATH=OBJC_INCLUDE_PATH:標頭檔案路徑              #java

終端重啟後需執行一次source。
另有一種方法:在/etc/ld.so.conf檔案中加入自定義的lib庫的路徑,然後執行sudo /sbin/ldconfig,這個方法對所有終端有效。


2)新增庫檔案路徑:
LIBRARY_PATH    #used by gcc before compilation to search for directories containing libraries that need to be linked to your program.
LD_LIBRARY_PATH    #used by your program to search for directories containing the libraries after it has been successfully compiled and linked.

例如:
MATLAB=/opt/MATLAB/R2012a

export LIBRARY_PATH=$LIBRARY_PATH:$MATLAB/bin/glnxa64
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$MATLAB/bin/glnxa64

題外話,順便提一下LIBRARY_PATH和LD_LIBRARY_PATH的區別:
我們知道Linux下有2種庫:static libraries和shared libraries。如(這裡)闡述的,靜態庫是在編譯期間會被連結並拷貝到你的程式中,因此執行時不再需要該靜態庫。動態庫在編譯時並不會被拷貝到你的程式中,而是在程式執行時才被載入,因此在程式執行時還需要動態庫存在,這時就會用到LD_LIBRARY_PATH指定的路徑去查詢這個動態庫。The libraries can be static or shared. If it is static then the code is copied over into your program and you don't need to search for the library after your program is compiled and linked. If your library is shared then it needs to be dynamically linked to your program and that's when LD_LIBRARY_PATH comes into play.


舉例說明以上2種方法的具體用法:

假設隨便一個簡單的函式叫做matlab_eigen.cpp,它用到第三方庫(matlab eigen函式),內容如下:

  1. /* 
  2.  * matlab_eigen.cpp 
  3.  * 
  4.  * This is an example of how to create a surface contour plot in MATLAB 
  5.  * http://cn.mathworks.com/matlabcentral/fileexchange/35311-matlab-plot-gallery-surface-contour-plot/content/html/Surface_Contour_Plot.html 
  6. */
  7. #include <iostream>
  8. #include <math.h>
  9. #include "engine.h"
  10. int main() {  
  11.     Engine *ep; //定義Matlab引擎指標。
  12.     if (!(ep=engOpen("\0"))) //測試是否啟動Matlab引擎成功。
  13.     {  
  14.         std::cout<< "Can't start MATLAB engine"<<std::endl;  
  15.         return EXIT_FAILURE;  
  16.     }  
  17.     // 向matlab傳送命令。在matlab內部自己去產生即將繪製的曲線上的資料。
  18.     // Create a grid of x and y data
  19.     engEvalString(ep, "y = -10:0.5:10;x = -10:0.5:10; [X, Y] = meshgrid(x, y);");  
  20.     // Create the function values for Z = f(X,Y)
  21.     engEvalString(ep, "Z = sin(sqrt(X.^2+Y.^2)) ./ sqrt(X.^2+Y.^2);");  
  22.     // Create a surface contour plor using the surfc function, Adjust the view angle
  23.     engEvalString(ep, "figure;surfc(X, Y, Z); view(-38, 18);");  
  24.     // Add title and axis labels
  25.     engEvalString(ep, "title('Normal Response');xlabel('x');ylabel('y');zlabel('z')");  
  26.     //Use cin.get() to make sure that we pause long enough to be able to see the plot.
  27.     std::cout<<"Hit any key to exit!"<<std::endl;  
  28.     std::cin.get();  
  29.     return EXIT_SUCCESS;  
  30. }  

用方法一編譯:
$ g++ matlab_eigen.cpp -o matlab_eigen -I/opt/MATLAB/R2012a/extern/include -L/opt/MATLAB/R2012a/bin/glnxa64 -leng -lmx


用方法二編譯:
設定環境變數:
MATLAB=/opt/MATLAB/R2012a
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$MATLAB/bin/glnxa64
export LIBRARY_PATH=$LIBRARY_PATH:$MATLAB/bin/glnxa64
export CPLUS_INCLUDE_PATH=CPLUS_INCLUDE_PATH:$MATLAB/extern/include

編譯:

$ g++ matlab_eigen.cpp -o matlab_eigen -leng -lmx


執行及結果:(如果你編譯過程遇到錯誤可以參考我這篇文章。)
./matlab_eigen

Hit any key to exit!

參考:
http://walkerqt.blog.51cto.com/1310630/1300119
http://stackoverflow.com/questions/4250624/ld-library-path-vs-library-path
http://blog.chinaunix.NET/uid-26980210-id-3365027.html

相關推薦

gcc/g++使用第三方新增檔案路徑檔案路徑方法

本文總結了使用第三方庫函式時將其路徑告訴編譯器(gcc和g++同理)的2種常用方式,並舉例說明了每種方式的具體用法。方法一:在編譯自己的專案時新增-L和-I編譯選項1)新增標頭檔案路徑:-I     #指明標頭檔案的路徑2)新增庫檔案路徑:-L    #指定目錄。link的

gcc -l引數-L引數(編譯檔案路徑檔案路徑的設定相關)

放在/lib和/usr/lib和/usr/local/lib裡的庫直接用-l引數就能連結了,但如果庫檔案沒放在這三個目錄裡,而是放在其他目錄裡,這時我們只用-l引數的話,連結還是會出錯,出錯資訊大概是:“/usr/bin/ld: cannot find -lxxx”,也就是連結程式ld在那3個目錄裡找不到l

linux-gcc 編譯文件文件搜索路徑

con 行程 efi lib local 先後 objc 路徑 oot 一、頭文件 gcc 在編譯時尋找所需要的頭文件 : ※搜尋會從-I開始 ※然後找gcc的環境變量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH

Linux中C/C++編譯新增檔案路徑方式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

gcc新增檔案的ABC

今天安裝NeutrinoRDPRDP時碰到了一個小問題: libavcodec/avcodec.h:沒有那個檔案或目錄 有過linux下多媒體開發經驗的同學,可能知道libavcodec是ffmpeg 裡面的內容。 首先判斷是否安裝了ffmpeg,沒有則安裝;安裝了ffmpe

codeblock新增檔案路徑靜態路徑(轉自CSDN使用者jiao319)

通常在一些專案中需要使用外部的標頭檔案和靜態庫檔案,codeblock通過如下方法新增標頭檔案和庫檔案。以codeblock 10.05為例新增標頭檔案:依次點選project->bulid options->Search directories,在該標籤頁中點

CMake新增檔案檔案,連結檔案

原文地址:http://www.cnblogs.com/binbinjx/p/5626916.html 羅列一下cmake常用的命令。 CMake支援大寫、小寫、混合大小寫的命令。 1. 新增標頭檔案目錄INCLUDE_DIRECTORIES 語法: include_directories([AFTE

qt新增檔案檔案

往qt裡面新增標頭檔案和庫檔案,需要在.pro檔案中新增INCLUDEPATH +=標頭檔案路徑。還要新增庫檔案的路徑LIBS+=庫檔案路徑\庫檔案.lib。 標頭檔案路徑和庫檔案路徑中含有空格時用雙引號將路徑包含起來就可以了

CMake學習-新增檔案路徑路徑

CMake中,新增標頭檔案路徑,對應的函式叫include_directories。然後在引數中,把所有需要新增的路徑,加進去就可以了。 新增庫路徑,對應的函式叫LINK_DIRECTORIES,同樣,在引數中,把所有的路徑加進去就可以了。CMake中的函式呼

VC2010中怎樣新增檔案路徑(外來的檔案)還有lib

編譯器查詢標頭檔案的順序是(1)原始檔(.c或.cpp)所在目錄(2)屬性->C/C++ ->常規->附加包含目錄(3)屬性->VC++目錄->包含目錄   如果你常使用它們,扔進你的VC庫Microsoft Visual Stu

關於VS中新增檔案顯示無法找到檔案的問題

目錄或庫檔名中包含漢字或空格的話,請將其用半形雙引號括住。專案、屬性、C/C++、附加包含目錄:填寫附加標頭檔案所在目錄 分號間隔多項專案、屬性、連結器、附加庫目錄:填寫附加依賴庫所在目錄 分號間隔多

Qt工程pro文件的簡單配置(尤其是第三方文件

tex target data 資源文件 rules tdi som trac 允許 Qt開發中,pro文件是對正工程所有源碼、編譯、資源、目錄等的全方位配置的唯一方式,pro文件的編寫非常重要,以下對幾個重要項進行說明(win和linux,mac平臺通用配置) 註釋

原子STM32例程,不用新增檔案的原因是SYS.H

大家好,在新建工程的時候給新增進去的韌體庫檔案(我用的是mini開發板,例子是跑馬燈的),例如放在USER目錄下,放在CORE目錄下的檔案,為什麼到最後main函式裡面,只有SYSTEM目錄下的這三個檔案被包含進來的呢 677a2804c82647b459883b2c0fcd4363_894.

vscode新增檔案路徑

win+p 。選擇c_cpp_properties.json { "configurations": [ { "name": "Linux", "includePath": [ "${workspaceFolder}/**", "/usr/src/linux

C語言如何定義,新增檔案

C語言標頭檔案的常用格式如下: #ifndef LABLE #define LABLE //程式碼部分 #endif 其中,LABLE為一個唯一的標號,命名規則跟變數的命名規則一樣。 常根據它

g++來進行編譯的檔案路徑問題

Linux中用 g++ 來對 .cpp檔案進行編譯的時候,當頭檔案不在系統預設的 /usr/local/include/ 中時,需要為其指定路徑。有如下幾種方法。 方法1、在進行編譯時用 -l 選項來指定路徑: # /path/to/eigen/ 為eigen標頭檔案的路徑所在。

gcc -D選項 編譯新增巨集定義

程式例項: #include <stdio.h> #include <stdlib.h> int main(int argc, char* argv[]) { #ifde

【C++】C語言標準以及標準檔案

靜態連結庫(Static Link Library)——   Linux 下的 .a 和 Windows 下的 .lib。 ANSI C 標準共定義了 15 個頭檔案,稱為“C標準庫”,所有的編譯器都必須支援,如何正確並熟練的使用這些標準庫,可以反映出一個程式

微控制器之KEIL--新增檔案庫

點選打開連結 KEIL v3新增STC系列微控制器庫檔案 方法+標頭檔案庫 增加一個微控制器資料庫,既可以選擇STC微控制器,又不影響原來資料庫的使用。  操作步驟:  1.下載用於keil的STC資料庫更名為STC.CDB。將資料夾中的檔案放到相應的資料夾下,若沒有S

UIWebView載入新增請求

http://codecloud.net/16258.html http://stackoverflow.com/questions/25539837/how-to-add-customize-http-headers-in-uiwebview-request-my-uiw