Linux下g++編譯以及使用靜態庫和動態庫的方法詳解

下面小編就為大家帶來一篇linux下g++編譯與使用linux庫和動態庫的方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

linux下,我們通常在IDE如VS的工程中開發C++項目,對于生成和使用靜態庫(*.lib)與動態庫(*.linuxl)可能都已經比較熟悉,但是,在linux環境下,則是另一套模式,對應的靜態庫(*.a)與動態庫(*.so)的生成與使用方式是不同的。剛開始可能會不適應,但是用多了應該會習慣這種使用,因為步驟上并沒有VS下配置那么繁瑣。

下面就分別總結下linux下生成并使用靜態庫與動態庫的方法:(由于是C++項目,所以編譯器用的g++,但是與gcc的使用是相通的)

首先是linux,把我們需要封裝成庫文件的linux的頭文件與源文件寫好,如下:

//myAPI.h?  int?ADD(int?a,?int?b);?  int?MINUS(int?a,?int?b);
//myAPI.cpp?  #include?"myAPI.h"?  ?  int?ADD(int?a,?int?b){?  ??return?a?+?b;?  }?  ?  int?MINUS(int?a,?int?b){?  ??return?a?-?b;?  }

接下來準備一個測試用的主函數源文件:

//main.cpp?  #include?"myAPI.h"?  #include?<iostream>?  ?  int?main(){?  ??std::cout?<p>最后,先編譯我們的 myAPI.cpp 文件生成 myAPI.o 目標文件</p> <pre class="brush:php;toolbar:false">g++?-c?myAPI.cpp

1.生成靜態庫并使用

Linux下用生成靜態庫的命令 ar 處理 myAPI.o 文件生成靜態庫文件,生成的庫文件應遵循規范,及linux下庫文件加“lib”前綴。所以針對本例,通過如下一條命令即可生成 libmyAPI.a 靜態庫:

ar?crv?libmyAPI.a?myAPI.o

接下來即可在項目編譯過程中利用靜態庫了,此時 myAPI.cpp 這個庫函數的定義文件已經不需要了。main.cpp 編譯命令如下(注意,依賴的靜態庫文件要放在被依賴項后面):

g++?main.cpp?libmyAPI.a?-o?output

編譯通過后即可運行可執行文件 output , 此時 libmyAPI.a 也已經是不需要的了。執行命令并輸出結果如下:

./output

Linux下g++編譯以及使用靜態庫和動態庫的方法詳解

2.生成動態庫并使用

linux下編譯時通過 -shared 參數可以生成動態庫(.so)文件,如下

g++?-shared?-fPIC?-o?libmyAPI.so?myAPI.o

生成的動態庫在編譯時需要聲明,運行時需要被依賴。聲明如下

g++?main.cpp?-L.?-lmyAPI?-o?output

”-L.”標記告訴G++函數庫可能位于當前目錄;使用”-lmyAPI”標記來告訴G++linux程序在連接階段linux共享函數庫libmyAPI.so。

使用時如果提示如下錯誤,則將 libmyAPI.so 移到 /usr/lib 目錄下即可:

./output

Linux下g++編譯以及使用靜態庫和動態庫的方法詳解

? 版權聲明
THE END
喜歡就支持一下吧
點贊13 分享