歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux下靜態庫與動態庫的生成與調用

Linux下靜態庫與動態庫的生成與調用

日期:2017/2/28 16:08:50   编辑:Linux教程

首先,這裡有3個概念,靜態庫,動態庫.

靜態庫:

是程序在鏈接時將靜態庫拷貝到可執行文件裡,即生成可執行文件後,即使刪除靜態庫,可執行文件仍可正常執行。

動態庫:

也叫共享庫,程序只是在鏈接時在可執行文件時保存了該庫的信息,可執行文件執行時候需要到LD_LIBRAY_PATH或者/etc/ld.so.config裡指定的路徑去尋找該庫並加載調用,因此如果刪除該庫,可執行文件將無法正常執行。

共享庫還有一調用方法,使用dlopen和dlsym來獲得方法指針,然後調用。

下面先說說生成靜態庫和動態庫的方法。

1.靜態庫的生成方法:

func1.c

int func1()

{

return 100;

}

func2.c

int func2(int a)

{

return a * a:

}

test.c

#include <stdio.h>

int func1();

int func2(int);

int main(int argc, char* argv[])

{

printf("func1:%d/n", func1());

printf("func2:%d/n", func2(20));

return 0;

}

(1).編譯func1.c和func2.c.

gcc -c func1.c func2.c

生成func1.o和func2.o

(2).利用ar來歸檔生成靜態庫

ar -rv libfunc.a func1.o func2.o

生成了libfunc.a,這個libxxxx.a是linux裡靜態庫文件的固定格式。這時可以將libfunc.a拷貝到系統的lib路徑,比如/usr/lib.

(3).編譯test.c並鏈接libfunc.a

gcc -o test test.c -L. -lfunc

這裡-L.是指定庫文件路徑。我碰到個一個奇怪的問題,如果是

gcc -o test -lfunc test.c -L.

的話會報錯找不到func1和func2,一定要把-l和-L放到test.c之後才能編譯過,目前還沒了解原因。

C++生成靜態庫的方法是一樣的。

g++ -c func1.c func2.c

ar -rv libfunc.a func1.o func2.o

g++ -o test test.c -L. -lfunc

a.如果C++裡調用C的庫,這時候函數聲明要加上extern "C"就可以了,例如

test.cpp

#include <iostream>

using namespace std;

extern "C" int func1();

extern "C" int func2(int);

int main(int argc, char *argv[])

{

cout<<"func1:"<<func1()<<endl;

cout<<"func2:"<<func2(20)<<endl;

return 0;

}

然後同樣用

g++ -o test test.cpp -L. -lfunc可以調用C的庫。

b.如果是C調用C++生成的庫,需要用C封裝一下C++的庫,然後再調用。

添加一個文件

adapter.cpp

#include "func1.h"

#include "func2.h"

extern "C"

{

int func3()

{

return func1();

}

int func4(int a)

{

return func2(a);

}

}

test.c裡改成

#include <stdio.h>

int func3();

int func4(int);

int main(int argc, char *argv[])

{

printf("func1:%d/n", func3());

printf("func2:%d/n", func4());

return 0;

}

Copyright © Linux教程網 All Rights Reserved