Linux下g++編譯與使用靜態庫和動態庫(轉載)

    在windows環境下,我們通常在IDE如VS的工程中開發C++項目,對於生成和使用靜態庫(*.lib)與動態庫(*.dll)可能都已經比較熟悉,但是,在linux環境下,則是另一套模式,對應的靜態庫(*.a)與動態庫(*.so)的生成與使用方式是不同的。剛開始可能會不適應,但是用多了應該會習慣這種使用,因爲步驟上並沒有VS下配置那麼繁瑣。下面就分別總結下linux下生成並使用靜態庫與動態庫的方法:(由於是C++項目,所以編譯器用的g++,但是與gcc的使用是相通的)


   首先是準備工作,把我們需要封裝成庫文件的函數的頭文件與源文件寫好,如下:

  1. //myAPI.h
  2. int ADD(int a, int b);
  3. int MINUS(int a, int b);

  1. //myAPI.cpp
  2. #include "myAPI.h"
  3. int ADD(int a, int b){
  4. return a + b;
  5. }
  6. int MINUS(int a, int b){
  7. return a - b;
  8. }

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

  1. //main.cpp
  2. #include "myAPI.h"
  3. #include <iostream>
  4. int main(){
  5. std::cout << "1 + 1 = " << ADD(1, 1) << std::endl;
  6. std::cout << "1 - 1 = " << MINUS(1, 1) << std::endl;
  7. return 0;
  8. }


最後,先編譯我們的 myAPI.cpp 文件生成 myAPI.o 目標文件

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


2.生成動態庫並使用

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

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

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

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

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

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

./output





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章