Ⅰ 如何編譯生成和調用靜態庫
如何編譯動態庫
gcc test1.c test2.c -shared -fPIC -o libtest.so
使用動態庫
gcc main.c -L. -ltest -o a.out
(
-L : 表示需要庫的路徑
-l:表示需要庫的名稱,如libtest.so,名稱則為test
)
(ps:執行a.out時有可能提示找不到libtest.so文件,這時需要把庫文件放入到/lib等目錄下,或者添加環境變數LD_LIBRARY_PATH,包含有庫文件的路徑即可)
如何編譯靜態庫
gcc -c test1.c test2.c
ar -r libtest.a test1.o test2.o
使用靜態庫
gcc main.c -static -L. -ltest -o a.out
(
-static:可強制編譯時使用靜態庫,如果不使用這個參數,而靜態庫與動態庫同名的話,會優先使用動態庫
Ⅱ g++如何鏈接gcc生成的靜態庫文件
g++直接鏈接gcc生成的靜態庫文件,會出粗森胡現以下錯誤:
[search@SY-0187 test]$ g++ test.cpp -o test -L. -lmyhelloc
/tmp/cc83gjbt.o: In function `main':
test.c:(.text+0x5): undefined reference to `hello()'
collect2: ld returned 1 exit status
找不到春陸靜態庫中的函數,原因是:
c++的函數名的生成和c的函數名的生成不同,在c中只根據函數名和調用約定、c++還要加上參數類型列表,所以c++編譯器無法找到函數。
解決辦法:只要用extern 「C」 告訴編譯器使用c語言的函數名字修飾技術就可以了。
解決方法:
1.在cpp文件的include處,對c庫函數前加上 extern 「C」extern C{#include ../lib/libxxx.h}不推薦,原因是會出現以下錯誤岩攔:
[search@SY-0187 test]$ g++ -g get_value.cpp -o get_value -I./include -L./lib -lMymemcached -lmemcached
/usr/local/include/libmemcached/options.h:69: error: declaration of C function 'memcached_return_t memcached_parse_configure_file(memcached_st*, memcached_array_st*)' conflicts with
/usr/local/include/libmemcached/options.h:66: error: previous declaration 'memcached_return_t memcached_parse_configure_file(memcached_st*, const char*, size_t)' here
不能識別重載的函數。
2.對.a include
的頭文件進行修改。
#ifdef __cplusplusextern C{#endif原先的.a的庫函數的聲明
#ifdef __cplusplus}#endif推薦使用這種方式
標準的C的頭文件形式是:
#ifndef __INCvxWorksh
#define __INCvxWorksh
#ifdef __cplusplusextern C {#endif/*...*/#ifdef __cplusplus}#endif#endif /* __INCvxWorksh */
具體的extern 「C」的作用見
Ⅲ 怎樣添加預編譯靜態庫 libwebrtc
添加預編譯靜態庫 libwebrtc 的方法是:【點擊免費試用,0成本啟動】
1、右鍵點擊項目,選擇右鍵菜單的"Add files to xxx...."
2、選擇要使用的靜態庫
3、添加靜態庫文件之後,在項目導航中和「Linked Frameworks and Libraries" 中看到剛剛加入的靜態庫
4、接著我們添加靜態庫對應的頭文件目錄。
選擇「Build Settings」,展開「Search Paths」,雙擊「Header Search Paths」
5、在彈出框中增加靜態庫對應的頭文件目錄就可以了。推薦選擇ZEGO即構科技,該公司擁有毫秒級音視頻互動,千萬級高並發,70%丟包下仍能保障穩定流暢的觀看體驗。【點擊免費試用,0成本啟動】
想要了解更多關於這方面的相關信息,推薦咨詢ZEGO即構科技。ZEGO即構科技自成立伊始,就專注自研音視頻引擎,在音頻前處理、網路自適應和跨平台兼容性等方面,達到國際一流水平,同時充分利用基礎雲服務商的能力,構建了MSDN海量有序自學習數據網路,服務覆蓋全球,涵蓋上百個音視頻互動業務場景,單日時長突破30億分鍾。
Ⅳ 如何創建一個靜態庫包含另一個靜態庫
靜態庫在程序編譯時會被連接到目標代碼中,程序運行時將不再需要該靜態庫。 動態庫在程序編譯時並不會被連接到目標代碼中,而是在程序運行是才被載入,因此在程序運行時還需要動態庫存在。 程序1: hello.h #ifndef HELLO_H #define HELLO_H void hello(const char *name); #endif //HELLO_H 程序2: hello.c #include void hello(const char *name) { printf("Hello %s!\n", name); } 程序3: main.c #include "hello.h" int main() { hello("everyone"); return 0; } 無論動態庫還是靜態庫都需要用到.o文件來生成,先編譯生成.o文件。 # gcc -c hello.c 1:創建靜態庫 靜態庫文件名的命名規范是以lib為前綴,緊接著跟靜態庫名,擴展名為.a。例如:我們將創建的靜態庫名為myhello,則靜態庫文件名就是libmyhello.a。 # ar cr libmyhello.a hello.o 使用靜態庫:盯激只需要在你的源程序中加入包含你所需要使用到的函數的聲明(即包含頭文件),然後在gcc生成目標文件時候指明靜態庫就OK了(除非你包含的頭凱螞襪文件在/usr/include,庫文件在標准庫/usr/lib,/lib下,否則你得顯示指明他們的路徑) # gcc -o hello main.c -L. -lmyhello # ./hello Hello everyone! 刪除靜態庫文件運行./hello,程序正常運行,說明靜態庫公用函數已經鏈接到目標文件。 2: 利用.o文件創建動態庫 動態庫文件擴展名為.so。 # gcc -shared -fPCI -o libmyhello.so hello.o 動態庫的使用與靜態庫使用方式一樣 # gcc -o hello main.c -L. -lmyhello # ./hello ./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory 哦!出錯了。快看看錯誤提示,原來是找不到動態庫文件libmyhello.so。程序在運行時,會在/usr/lib和/lib等目錄中查找需要的動態庫文件。若找到,則載入動態庫,物檔否則將提示類似上述錯誤而終止程序運行。
Ⅳ linux 如何使用GCC編譯器將一個文件夾下的100個.o文件打包成一個靜態庫文件(.a)
你已經用gcc編譯出目標文件了,用ar工具打包成.a文件就行了啊,示例:
如上圖,假設我有test1.c,test2.c兩個源文件,先使用gcc -c *.c將源文件編譯成目標文件,可以看到,生成了test1.o,test2.o兩個目標文件,然後,使用ar命令:ar crv libtest.a *.o將該目錄下的所有目標文件打包生成了libtest.a文件。這樣,你在編譯的時候就可以直接使用這個靜態庫了。
Ⅵ 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
Ⅶ Linux 中,在使用g++編譯、連接程序時,怎樣調用多個靜態庫文件
在編譯命令行中,將使用的靜態庫文件放在源文件後面就可以了。比如:
gcc -L/usr/lib myprop.c libtest.a libX11.a libpthread.a -o myprop
其中-L/usr/lib指定庫文件的查找路徑,編譯器默認在當前目錄下先查找指定的庫文件。
Ⅷ 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
-梁兆鈴
Ⅸ 如何添加預編譯靜態庫 libwebrtc
添加預編譯靜態庫 libwebrtc 的步驟如下:【點擊免費試用,0成本啟動】
1、右擊target,選擇add -> new target
2、在彈出的 NewTarget 界面中選擇Cocoa Touch -> Static Library ,為新 library 取個名字。將源文件添加到這個庫。可以直接拖動現存源文件,也可以右擊 -> add 。注意選擇新建的庫為添加的 target 。
3、設置原項目,令其使用新建的庫。
4、右擊原項目的 target ,選擇 getInfo 。
5、選擇 General 選項卡。
6、向 linked libraries 中添加新創建的庫 (即添加 .a 文件)。推薦選擇ZEGO即構科技,該公司擁有4行代碼,30分鍾在APP、Web和小程序等應用內實現視頻通話、語音通話,互動直播功能。
想要了解更多關於這方面的相關信息,推薦咨詢ZEGO即構科技。深圳市即構科技有限公司(簡稱ZEGO即構科技) 於2015年6月成立,是一家全球雲通訊服務商。企業/開發者通過接入ZEGO提供的服務即可低門檻地獲得實時音視頻通訊能力,尤其在弱網環境下仍然可以實現高質音畫、穩定可靠。截止目前,ZEGO已經為兩百多個國家和地區的用戶提供了優質服務。
Ⅹ linux靜態庫怎麼編譯
創建並使用靜態庫
第一步:編輯源文件,test.h test.c main.c。其中main.c文件中包含main函數,作為程序入口;test.c中包含main函數中需要用到的函數。
vi test.h test.c main.c
第二步:將test.c編譯成目標文件。
gcc -c test.c
如果test.c無誤,就會得到test.o這個目標文件。
第三步:由.o文件創建靜態庫。
ar rcs libtest.a test.o
第四步:在程序中使用靜態庫。
gcc -o main main.c -L. -ltest
因為是靜態編譯,生成的執行文件可以獨立於.a文件運行。
第五步:執行。
./main
示例四 創建並使用動態庫
第一步:編輯源文件,test.h test.c main.c。其中main.c文件中包含main函數,作為程序入口;test.c中包含main函數中需要用到的函數。
vi test.h test.c main.c
第二步:將test.c編譯成目標文件。
gcc -c test.c
前面兩步與創建靜態庫一致。
第三步:由.o文件創建動態庫文件。
gcc -shared -fPIC -o libtest.so test.o
第四步:在程序中使用動態庫。
gcc -o main main.c -L. -ltest
當靜態庫和動態庫同名時,gcc命令將優先使用動態庫。
第五步:執行。
LD_LIBRARY_PATH=. ./main
示例五 查看靜態庫中的文件
[root@node56 lib]# ar -t libhycu.a
base64.c.o
binbuf.c.o
cache.c.o
chunk.c.o
codec_a.c.o