導航:首頁 > 源碼編譯 > 靜態編譯下lib庫從哪裡拷貝

靜態編譯下lib庫從哪裡拷貝

發布時間:2023-01-26 10:03:25

⑴ C++中關於靜態庫lib的問題~急~~

首先,lib是靜態庫,這個靜態是對編譯器而言的,即使此lib是某個動態庫的導入庫也是一樣。靜態庫要在編譯期間確定位置,即在編譯時必須告訴編譯器此lib在哪,這不是能用API函數確定的,你必須在編譯器選項或編譯軟體環境中設定,對於VC6.0編譯器,該設定方式在"Tools->Options...->Directories"標簽下,具體設定方式很簡單但描述起來較麻煩,你可以到網上搜索相關幫助。
其次,你所說的相對路徑是在程序運行時確定的,它的確定方式或許會與你的可執行程序所運行的操作系統有關,對不同的操作系統可能有不同的確定方式,對於Windows操作系統,一般來說當前路徑就是可執行文件所在的目錄,比如".\\abc\\123\\1.res"即表示在可執行文件所在目錄下有個名為abc子目錄,在abc子目錄下有個名為123的子目錄,在123子目錄下有個名為1.res的文件。

⑵ 如何在編譯器里設置調用別人寫好的lib和dll步驟

如何在編譯器(vs2008)里設置調用別人寫好的lib和dll如何在編譯器(vs2008)里設置調用別人寫好的lib和dll步驟:1.Tools->options->projectsandsolutions->VC++directories分別在包含文件,庫文件填加了路徑(這些路徑只告訴編譯器怎麼找文件,沒有說把那裡面的文件加入工程.)(若不設置,編譯報錯:無法打開***文件)2.Project->properties->c/c++->general->additionalincludedirectories添加包含文件Project->properties->linker->general->additionallibrarydirectories添加庫文件Project->properties->linker->input->添加用到的lib(這一步也可以在代碼中顯示調用#pragmacomment(lib,"***.lib"))(若不添加,連接報錯:無法解析的外部符號)3.將dll文件拷貝到工程debug文件下(如果不拷貝,編譯鏈接不報錯,運行報錯:無法找到***.dll)切記第三條,讓老子排查了一上午,當然最好把所有輸出目錄定位到一個文件下面。附:DLL與LIB文件的區別共有兩種庫:一種是LIB包含了函數所在的DLL文件和文件中函數位置的信息(入口),代碼由運行時載入在進程空間中的DLL提供,稱為動態鏈接庫dynamiclinklibrary。一種是LIB包含函數代碼本身,在編譯時直接將代碼加入程序當中,稱為靜態鏈接庫staticlinklibrary。共有兩種鏈接方式:動態鏈接使用動態鏈接庫,允許可執行模塊(.dll文件或.exe文件)僅包含在運行時定位DLL函數的可執行代碼所需的信息。靜態鏈接使用靜態鏈接庫,鏈接器從靜態鏈接庫LIB獲取所有被引用函數,並將庫同代碼一起放到可執行文件中。關於lib和dll的區別如下:(1)lib是編譯時用到的,dll是運行時用到的。如果要完成源代碼的編譯,只需要lib;如果要使動態鏈接的程序運行起來,只需要dll。(2)如果有dll文件,那麼lib一般是一些索引信息,記錄了dll中函數的入口和位置,dll中是函數的具體內容;如果只有lib文件,那麼這個lib文件是靜態編譯出來的,索引和實現都在其中。使用靜態編譯的lib文件,在運行程序時不需要再掛動態庫,缺點是導致應用程序比較大,而且失去了動態庫的靈活性,發布新版本時要發布新的應用程序才行。(3)動態鏈接的情況下,有兩個文件:一個是LIB文件,一個是DLL文件。LIB包含被DLL導出的函數名稱和位置,DLL包含實際的函數和數據,應用程序使用LIB文件鏈接到DLL文件。在應用程序的可執行文件中,存放的不是被調用的函數代碼,而是DLL中相應函數代碼的地址,從而節省了內存資源。DLL和LIB文件必須隨應用程序一起發行,否則應用程序會產生錯誤。如果不想用lib文件或者沒有lib文件,可以用WIN32API函數LoadLibrary、GetProcAddress裝載。使用lib需注意兩個文件:(1).h頭文件,包含lib中說明輸出的類或符號原型或數據結構。應用程序調用lib時,需要將該文件包含入應用程序的源文件中。(2).LIB文件,略。使用dll需注意三個文件:(1).h頭文件,包含dll中說明輸出的類或符號原型或數據結構的.h文件。應用程序調用dll時,需要將該文件包含入應用程序的源文件中。(2).LIB文件,是dll在編譯、鏈接成功之後生成的文件,作用是當其他應用程序調用dll時,需要將該文件引入應用程序,否則產生錯誤。如果不想用lib文件或者沒有lib文件,可以用WIN32API函數LoadLibrary、GetProcAddress裝載。(3).dll文件,真正的可執行文件,開發成功後的應用程序在發布時,只需要有.exe文件和.dll文件,並不需要.lib文件和.h頭文件

linux下的靜態庫和動態庫

靜態庫

可以把它想像成是一些代碼的集合,在可執行程序運行前就已經加到了代碼中,成為了執行程序的一部分,一般是以.a為後綴的文件名,Windows下後綴為.lib。靜態庫的命名也分為三部分,1、前綴:lib,2、庫的名稱:隨意,如lisi,3、後綴:.a。

靜態庫優缺點

上面簡單介紹了靜態庫,那它自然也會有優缺點,這里來介紹下它的優缺點。

優點:1、在最後,函數庫是被打包到應用程序中的,實現函數本地化、定址方便、高效。2、程序在運行的時候,與函數庫沒有關系,移植性更強。

缺點:1、消耗資源較大,每個進程在使用靜態庫的時候,都要復制一份才可以,這也就造成了內存的消耗。2、在程序更新、部署、發布的時候,使用靜態庫相對麻煩,如果一個靜態庫更新了,那它的應用程序都需要重新編譯,再發送給用戶,有的時候可能只是一個小的改動,但對於用戶來說,會導致整個程序重新下載。

動態庫

在程序編譯時不會被連接到目標代碼中,在後期運行時才會載入,不同的應用程序如果調用相同的庫,內存中只有一份共享庫的拷貝,也就避免了空間的浪費問題。一般以.so作為文件後綴名,也分為三部分:1、前綴:lib,2、庫名稱:自定義,3、後綴:.so

動態庫優缺點

優點:1、節省內存2、部署、升級相對方便,只需要更換動態庫,再重新啟動服務即可。

缺點:1、載入速度比靜態庫慢2、移植性較差,需要把所有用到的動態庫進行移植。

⑷ linux下的VLC編譯好動態庫後,還需要拷貝哪些文件,其他電腦才能夠使用

舉例,頭文件名 abc.h 函數名為 abc_test(); 第三方庫頭文件目錄為/abc/include/ 鏈接庫目錄為/abc/lib/1、頭文件和源文件:這是最好的情況,引用頭文件和相關函數即可。如:#include "abc.h"abc_test();//直接調用即可編譯時,Makefile中加入編譯選項 -I/abc/include 為了能將庫的頭文件引進來。而且你的程序運行時,不再需要這個第三方庫。2、靜態鏈接庫:引用頭文件和相關函數,設提供的靜態庫名為 libabc.lib編譯時,Makefile中加入 編譯選項1)-I/abc/include #編譯時加,為了能將庫的頭文件引進來;2)-L/abc/lib -labc #鏈接時加的而且你的程序運行時,不再需要這個第三方庫。3、動態鏈接庫,設動態鏈接庫為libabc.so調用動態鏈接庫文件,需要dlopen等函數編譯時,Makefile中加入 編譯選項1)-I/abc/include #編譯時加,為了能將庫的頭文件引進來;2)-L/abc/lib -labc #鏈接時加的注意:你的程序運行時,需要這個第三方庫的libabc.so文件。

⑸ Ubuntu靜態庫怎麼使用

-供參考
linux 靜態庫的生成與使用
1、windows系統包括靜態鏈接庫(*.lib文件)和動態鏈接庫(*.dll文件)。

2、linux通常把庫文件存放在/usr/lib或/lib目錄下。
linux庫文件名:前綴lib、庫名和後綴3部分組成,其中動態鏈接庫以.so作為後綴,靜態鏈接庫通常以.a作為後綴。

區別:
靜態鏈接庫的代碼在編譯時就拷貝到應用程序中,這樣的優點是節省編譯時間動態庫是程序在開始運行後調用庫函數時才被載入。
靜態庫的創建和使用

1、在一個頭文件中聲明靜態庫所導出的函數。
2、在一個源文件中實現靜態庫所導出的函數。
3、編譯源文件,生成可執行代碼(.o文件)
4、將可執行代碼所在的目標文件加入到某個靜態庫中,並將靜態庫拷貝到系統默認的存放文件的目錄下。
例如:mylib.h聲明函數, mylib.c實現函數

1、編譯mylib.c生成目標文件:gcc -o mylib.o -c mylib.c
2、將目標文件加入到靜態庫中:ar rcs libmylib.a mylib.o
3、將靜態庫到linux的庫目錄 (/usr/lib 或者 /lib)下:
cp libmylib.a /usr/lib/libmylib.a
4、在調用庫函數的文件中添加#include "mylib.h"這樣就可調用靜態庫中函數
5、使用靜態庫編譯:gcc -o main main.c -l mylib
注意:編譯時無需帶上前綴和後綴。這就是為什麼在使用libxml2時librareis(-l)設置為:xml2
-梁兆鈴

⑹ linux靜態庫怎麼編譯

linux庫有動態與靜態兩種,動態通常用.so為後綴,靜態用.a為後綴。例如:libhello.so
libhello.a
為了在同一系統中使用不同版本的庫,可以在庫文件名後加上版本號為後綴,例如:
libhello.so.1.0,由於程序連接默認以.so為文件後綴名。所以為了使用這些庫,通常使用建立符號連接的方式。
ln
-s
libhello.so.1.0
libhello.so.1
ln
-s
libhello.so.1
libhello.so
動態庫和靜態庫的區別:
當要使用靜態的程序庫時,連接器會找出程序所需的函數,然後將它們拷貝到執行文件,由於這種拷貝是完整的,所以一旦連接成功,靜態程序庫也就不再需要了。然而,對動態庫而言,就不是這樣。動態庫會在執行程序內留下一個標記『指明當程序執行時,首先必須載入這個庫。由於動態庫節省空間,linux下進行連接的預設操作是首先連接動態庫,也就是說,如果同時存在靜態和動態庫,不特別指定的話,將與動態庫相連接。
兩種庫的編譯產生方法:
第一步要把源代碼編繹成目標代碼。以下面的代碼hello.c為例,生成hello庫:
/*
hello.c
*/
#include
void
sayhello()
{
printf("hello,world\n");
}
用gcc編繹該文件,在編繹時可以使用任何全法的編繹參數,例如-g加入調試代碼等:
gcc
-c
hello.c
-o
hello.o
1.連接成靜態庫
連接成靜態庫使用ar命令,其實ar是archive的意思
$ar
cqs
libhello.a
hello.o
2.連接成動態庫
生成動態庫用gcc來完成,由於可能存在多個版本,因此通常指定版本號:
$gcc
-shared
-wl,-soname,libhello.so.1
-o
libhello.so.1.0
hello.o
另外再建立兩個符號連接:
$ln
-s
libhello.so.1.0
libhello.so.1
$ln
-s
libhello.so.1
libhello.so
這樣一個libhello的動態連接庫就生成了。最重要的是傳gcc
-shared
參數使其生成是動態庫而不是普通執行程序。
-wl
表示後面的參數也就是-soname,libhello.so.1直接傳給連接器ld進行處理。實際上,每一個庫都有一個soname,當連接器發現它正在查找的程序庫中有這樣一個名稱,連接器便會將soname嵌入連結中的二進制文件內,而不是它正在運行的實際文件名,在程序執行期間,程序會查找擁有
soname名字的文件,%b

閱讀全文

與靜態編譯下lib庫從哪裡拷貝相關的資料

熱點內容
90壓縮干糧09壓縮干糧 瀏覽:511
android線程池框架 瀏覽:478
手機自帶解壓能解壓哪些文件 瀏覽:802
linux安裝hba驅動 瀏覽:119
java構造函數new 瀏覽:668
怎麼查家裡電器耗電量app 瀏覽:506
原神一直顯示重新連接伺服器怎麼辦 瀏覽:826
一般用途軸流式壓縮機 瀏覽:926
沒學歷的怎麼學編程 瀏覽:901
華為的隱藏相冊無法加密 瀏覽:782
聯通套餐app怎麼設置 瀏覽:752
關於刪除鏈表的演算法描述 瀏覽:894
標准盤和壓縮盤的區別 瀏覽:47
銀行存款驗證碼JAVA編程 瀏覽:111
word轉pdf軟體免費版 瀏覽:139
公主連結安卓台服怎麼下載 瀏覽:550
注冊江蘇銀行app怎麼注冊 瀏覽:800
中興怎麼下載app視頻 瀏覽:679
伺服器審計是什麼 瀏覽:518
華為刪除的app怎麼徹底卸載 瀏覽:574