windows 调用linux .a lib,动态链接库及静态链接库(windows下的.dll .lib和linux下的.so .a)...
動(dòng)態(tài)鏈接庫及靜態(tài)鏈接庫(windows下的.dll .lib和linux下的.so .a) 庫有動(dòng)態(tài)與靜態(tài)兩種,動(dòng)態(tài)通常用.so為后綴,靜態(tài)用.a為后綴。例如:libhello.so libhello.a 為了在同一系統(tǒng)中使用不同版本的庫,可以在庫文件名后加上版本號為后綴,例如: libhello.so.1.0,由于程序連接默認(rèn)以.so為文件后綴名。所以為了使用這些庫,通常使用建立符號連接的方式。
ln -s libhello.so.1.0 libhello.so.1 ln -s libhello.so.1 libhello.so
使用庫
當(dāng) 要使用靜態(tài)的程序庫時(shí),連接器會(huì)找出程序所需的函數(shù),然后將它們拷貝到執(zhí)行文件,由于這種拷貝是完整的,所以一旦連接成功,靜態(tài)程序庫也就不再需要了。然 而,對動(dòng)態(tài)庫而言,就不是這樣。動(dòng)態(tài)庫會(huì)在執(zhí)行程序內(nèi)留下一個(gè)標(biāo)記 指明當(dāng)程序執(zhí)行時(shí),首先必須載入這個(gè)庫。由于動(dòng)態(tài)庫節(jié)省空間,linux下進(jìn)行連接的 缺省操作是首先連接動(dòng)態(tài)庫,也就是說,如果同時(shí)存在靜態(tài)和動(dòng)態(tài)庫,不特別指定的話,將與動(dòng)態(tài)庫相連接。
現(xiàn)在假設(shè)有一個(gè)叫hello的程序開發(fā)包,它提供一個(gè)靜態(tài)庫libhello.a 一個(gè)動(dòng)態(tài)庫libhello.so,一個(gè)頭文件hello.h,頭文件中提供sayhello()這個(gè)函數(shù)
/* hello.h */
void sayhello();
另外還有一些說明文檔。這一個(gè)典型的程序開發(fā)包結(jié)構(gòu)
1.與動(dòng)態(tài)庫連接
linux默認(rèn)的就是與動(dòng)態(tài)庫連接,下面這段程序testlib.c使用hello庫中的sayhello()函數(shù) /*testlib.c*/
#include
#include
int main()
{
sayhello();
return 0;
}
使用如下命令進(jìn)行編譯
$gcc -c testlib.c -o testlib.o
用如下命令連接:
$gcc testlib.o -lhello -o testlib
在連接時(shí)要注意,假設(shè)libhello.o 和libhello.a都在缺省的庫搜索路徑下/usr/lib下,如果在其它位置要加上-L參數(shù)
與與靜態(tài)庫連接麻煩一些,主要是參數(shù)問題。還是上面的例子:
$gcc testlib.o -o testlib -WI,-Bstatic -lhello
注:這個(gè)特別的"-WI,-Bstatic"參數(shù),實(shí)際上是傳給了連接器ld.
指示它與靜態(tài)庫連接,如果系統(tǒng)中只有靜態(tài)庫當(dāng)然就不需要這個(gè)參數(shù)了。
如果要和多個(gè)庫相連接,而每個(gè)庫的連接方式不一樣,比如上面的程序既要和libhello進(jìn)行靜態(tài)連接,又要和libbye進(jìn)行動(dòng)態(tài)連接,其命令應(yīng)為:
$gcc testlib.o -o testlib -WI,-Bstatic -lhello -WI,-Bdynamic -lbye
3.動(dòng)態(tài)庫的路徑問題
為了讓執(zhí)行程序順利找到動(dòng)態(tài)庫,有三種方法:
總結(jié)
以上是生活随笔為你收集整理的windows 调用linux .a lib,动态链接库及静态链接库(windows下的.dll .lib和linux下的.so .a)...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hotkey.exe是什么进程 有什么作
- 下一篇: hookdump.exe是什么进程 有什