1. 程式人生 > >linux中建立自己的靜態庫 動態庫並使用

linux中建立自己的靜態庫 動態庫並使用

庫依賴:
gcc connect.c –o connect –I /usr/include/mysql –L /usr/lib/mysql -lmysqlclient
//-I是找到自己寫的標頭檔案所在的位置 -L是找到自己所寫的動態庫所在的位置,並且寫上函式名,靜態庫不用寫-L,只寫函式名//-I 是i 的大寫

先編譯一邊,會發現報錯,然後解析一下,沒有包含標頭檔案

新增上標頭檔案-I /usr/local/include/mysql後,在編一下,發現還有函式沒有識別出來,是因為沒有包含相應的庫檔案。

然後將庫檔案新增上以後,在進行編譯發現問題搞定了

 

 


這些操作都是在test的資料夾下做的,如果不是的話,用-I 和-L -I來找到標頭檔案的的位置,-L和動態庫的位置,

//在test的資料夾下有 main.c xiangjia.c xianjian.c xiangjia.h xiangjian.h//都是自己寫的

main.c中

#include <stdio.h>//正常寫法
#include "mymath.h"//自己定義的
int main()
{ 
  int t=xiangjia(65,4);
  int z=xiangjian(45,2);
  printf("%d %d\n",t,z);
  return 0;
}

 

xiangjia.c中

int xiangjia(int a,int b)
{
  return
a+b: }

 

xiangjian.c中

int xiangjian.(int a,int b)
{
  return a-b;
}

 

mymath.h中

#ifndef MYMATH_H   //如果沒有定義這個標頭檔案
#define MYMATH_H  //那麼定這個
  int xiangjian(int a,int b);//xxx.c中的函式的宣告
  int xiangjia(int a,int b);
#endif

 

 

 

靜態操作
[[email protected] test]# gcc -c main.c xiangjia.c xiangjian.c //然後對所有的.c檔案進行轉換,變成.o目標檔案
[

[email protected] test]# ar cr libmylib.a xiangjian.o xiangjia.o //然後用ar cr 對.o檔案進行操作,轉換成靜態庫,並起個名字,格式:libxxxx.a
[[email protected] test]# gcc -o mylib main.o libmylib.a //然後,使用-o對main.o 和已經生成的靜態庫libxxxxx.a重新命名,
[[email protected] test]# ./mylib //然後找到重新命名的檔案進行測試,執行 :/找到路徑/名字
110
20


動態操作
[[email protected] test]# gcc -shared -fPCI -o libmyname.so xiangjian.o xiangjia.o //使用這個命令,對靜態所生成的函式目標檔案,進行重新命名,格式:libxxxxx.so

[[email protected] test]# cp -r libmyname.so /lib //然後複製所生成的libxxxxx.so即動態檔案到 /lib資料夾下

[[email protected] Desktop]# gcc -o mymath ./test/main.c -L /lib/ -lmyname //然後對/路徑/main.c 重新命名 為 xxxxxx(mymath),並使用-L 找到/lib/ -lxxxx(即libxxxxx.so的縮寫),新增這個路徑
[[email protected] Desktop]# ./mymath
110
20
[[email protected] Desktop]#