當前位置:首頁 » 編程軟體 » 怎麼編譯庫

怎麼編譯庫

發布時間: 2022-01-23 21:55:57

Ⅰ 如何編譯生成和調用靜態庫

如何編譯動態庫
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:可強制編譯時使用靜態庫,如果不使用這個參數,而靜態庫與動態庫同名的話,會優先使用動態庫

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

Ⅲ 怎麼才能將C語言程序,編譯成可執行文件,需要什麼庫和文件,怎麼建立庫和文件

需要C語言運行的環境,比如Microsoft Visual C++ 6.0,然後寫入可執行的文件,一般的簡單函數只需要<stdio.h>

Ⅳ 如何將源文件編譯成庫文件

問題說的不是很清楚!
如果你是希望你編的函數能像庫函數那樣直接調用的話
可以把你的函數放到一個文件里
如果以後你那個程序需要這些函數時直接包含該文件就行了
像使用頭文件那樣#include"myfile.c"( 注意這里是用雙引號)
然後在你程序中就可以直接調用你自定義的函數了

如果我理解題目錯誤,敬請原諒!

【原創答人】

Ⅳ 怎樣編譯載入共享庫的可執行程序

1.下載FatJar插件2.安裝之後,右鍵選擇項目時,會出現BuildFatJar,選擇該方法,然後按照向導即可一步步導出可執行jar文件。如果有外部的jar包,比如說sqljdbc.jar,則把所有要使用的第三方的jar包都復制到{java_home}\jre\lib\ext目錄下。(必須重新啟動Eclipse才能載入這些jar包)而象SWT項目這樣所使用的jar包,則不需要這么設置,直接在向導中選擇所需要的jar包即可。3.然後就可以在導出目錄中運行這個可執行jar包,但如果是SWT項目,則必須在包含該可執行jar包的目錄下有一個swt-win32-3235.dll之類的文件。4.有了可執行的jar文件,然後可以使用exe4j.exe之類的jar轉exe軟體,如果使用exe4j.exe則當調用到sqljdbc.jar之類的外部包時,則必須將sqljdbc.jar也一並導入。安裝向導就可以生成exe文件了,如果是SWT項目則也必須在同目錄下有swt-win32-3235.dll之類的文件。

Ⅵ 如何在源碼編譯中增加第三方庫

很多時候在開發APK的時候需要調用載入調用獨立的第三方庫文件 下面舉例如何在應用中添加

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_CERTIFICATE := platform
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under,src)
LOCAL_STATIC_JAVA_LIBRARIES := libammsdk //隨便起的第三方庫別名
LOCAL_PACKAGE_NAME := wechat_sdk_sample_android
include $(BUILD_PACKAGE)

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := libammsdk:libs/libammsdk.jar
//libammsdk:libs/libammsdk.jar是給libs/libammsdk.jar起別名,但是必須和LOCAL_STATIC_JAVA_LIBRARIES中的名稱一致
include $(BUILD_MULTI_PREBUILT)

Ⅶ c++庫使用前要編譯但有些庫windows下不知道如何編譯

有些源代碼是平台相關的,只能在linux下編譯,因為使用了linux特有的頭文件和系統調用。

Ⅷ 在TC中,怎樣用命令編譯lib庫

定義函數庫的方法及應用:

一、2個相關的命令

1、TCC——TC的DOS下的命令行編譯連接工具
2、TLIB——TC的DOS下的庫操作工具

二、1個自定義的函數庫的例子

1、 在TC集成環境下,編一個文件USERADD.C
#define _NO_MAIN
int add(int *a,int *b)
{ int c;
c=(*a)+(*b);
return c;
}
按ALT—F9編譯 生成一個 USERADD.OBJ文件。

2、按F10—F—O 退到DOSSHELL(DOS環境下)
COPY USERADD.OBJ 到 ..\LIB目錄,在\LIB目錄下執行
TLIB USERLIB.LIB+USERADD.OBJ 就生成了一個自己的函數庫 USERLIB,在這個函數庫里就包含了函數模塊 int add(int *a,int *b) 的二進制代碼。現在已經將自定義的函數放進了函數庫,就可以把原文件USERADD.C刪掉不要了。(當然,為了以後維護方便,還是作一個備份為好)。 以後如有其它的函數模塊,也可以編譯後用TLIB 命令加入到這個函數庫里。

3、寫一個包含文件 USER1.H,寫完後COPY到INCLUDE 目錄。內容如下:
int add(int *,int *);

4、作好了以上的自定義函數庫的准備工作,現在就可以使用了。
寫一個程序,取名為ADD-1.C,在程序中調用庫函數add( );
#include<stdio.h>
#include<user1.h>
void main( )
{
int a,b,c;
a=20;b=30;
c=add(&a,&b);
printf(「%d」,c);
}

5、在DOS命令行下,執行 TCC ADD-1.C ..\LIB\USERLIB.LIB 就OK!
運行ADD-1.EXE,可以看到輸出結果 50
Tc生成lib的方法:
擴展庫與自建LIB庫使用擴展庫TC所帶的庫在有的情況下是無法滿足功能要求的,自己寫一個太麻煩,找到了一個LIB庫又怕不會用。在WIN-TC中,對於使用外部的擴展庫(第三方LIB)提供了一個方便的解決方法:首先要確定你的LIB庫是FOR TC版本的而不是FOR VC或是其它的。如果確定是FOR TC的版本的話就把你的首標文件(或稱頭文件),就是擴展名為*.h的文件拷貝到WIN-TC的include目錄里,然後把相應名稱的*.lib文件拷貝到lib目錄,然後再運行WIN-TC時選擇「編譯配置」菜單項,你會看到擴展庫信息欄目里有你的LIB庫文件名在上面了,但是沒有打鉤。然後你把它鉤選後再「確定」保存,以後的編譯程序時就自動鏈接該擴展庫了。自建立LIB庫將自己的代碼編譯成LIB庫的格式有利與保護自己的代碼版權。如何來生成自己的LIB庫呢?請按照下面的方法:
STEP 1——生成目標代碼(OBJ) 建立mylib的代碼文件/********************* mylib.c *********************/void myfun(){printf("
myfun() in mylib.lib
");}然後保存為WIN-TC目錄下的mylib.c文件然後到菜單項:運行->編譯設置 看看「產生 OBJ 文件」是否已選擇,若未選擇則選擇之。然後回到主界面,點「編譯鏈接」按鈕(F9)STEP 2——建立LIB庫(LIB)將WIN-TC目錄下生成的mylib.obj文件拷貝至WIN-TC的BIN目錄,然後在該目錄下用記事本建立一批處理文件makelib.bat,內容如下:Tlib mylib.lib +mylib.obj然後雙擊運行,則在BIN目錄下生成了mylib.lib庫文件。至此,你會覺得勝利開始向你招手了,不過你必須按部就班完成剩下的任務才能達到使用自建LIB庫的最終目標。STEP 3——建立首標文件(*.h)並使用LIB庫將BIN目錄下的mylib.lib拷貝至WIN-TC的lib目錄。然後打開WIN-TC的菜單:運行->編譯配置你會看到「擴展庫信息」列表裡面有你生成的mylib.lib了,不過沒有打鉤,將它單擊鉤選,以後編譯時就可以自動鏈接該庫了。剩下的時就是建立首標文件了,用WIN-TC新建一文件,裡面只需要寫一句話:void myfun();如果擔心反復引用的話,可以加上#ifndef #define #endif的結構,例如將以上結構用__MYLIB1來避免反復引用寫為:#ifndef __MYLIB#define __MYLIBvoid myfun();#endif然後「保存」,在彈出的保存對話框裡面的保存類型里選擇最下面的頭文件(*.h),保存位置為WIN-TC的INCLUDE目錄,文件名要與建立的庫一致既為mylib。如果順利的話,在INCLUDE目錄下將可以看到一個mylib.h文件。至此,你已經按照步驟建立了LIB庫並完成了WIN-TC的相關設置,接下來將檢驗自己的勞動成果了。STEP 4——測試自己的LIB庫新建測試文件如下:#include "mylib.h" /*包含自定義庫的頭文件*/main(){myfun();getch();}激動人心的時刻到了(如果你是第一次做自己的庫會有這種感覺的),使用用Ctrl+F9編譯運行之,如果成功的話,你將會看到下面的屏幕輸出:myfun() in mylib.lib如果出現錯誤信息的話,你再檢查一下你自己是否是嚴格按照步驟生成並使用的LIB庫需要注意一下:由於DOS路徑長度的限制,同時使用(鉤選)的根據路徑長短最多可以同時支持10個!

Ⅸ 如何用gcc編譯動態庫

今天要用到靜態庫和動態庫,於是寫了幾個例子來鞏固一下基礎。
hello1.c ————————————————————
#include <stdio.h>
void print1(int i) { int j; for(j=0;j<i;j++) { printf("%d * %d = %d\n",j,j,j*j); } }
hello2.c _________________________________________________
#include <stdio.h>
void print2(char *arr) { char c; int i=0; while((c=arr[i++])!='\0') { printf("%d****%c\n",i,c); } }
hello.c ____________________________________________________
void print1(int); void print2(char *);
int main(int argc,char **argv) { int i=100; char *arr="THIS IS LAYMU'S HOME!"; print1(i); print2(arr);
return 0; }

可以看到hello.c要用到hello1.c中的print1函數和hello2.c中的print2函數。所以可以把這兩個函數組合為庫,以供更多的程序作為組件來調用。

方法一:將hello1.c和hello2.c編譯成靜態鏈接庫.a
[root@localhost main5]#gcc -c hello1.c hello2.c
//將hello1.c和hello2.c分別編譯為hello1.o和hello2.o,其中-c選項意為只編譯不鏈接。
[root@localhost main5]#ar -r libhello.a hello1.o hello2.o
//將hello1.o和hello2.o組合為libhello.a這個靜態鏈接庫
[root@localhost main5]#cp libhello.a /usr/lib
//將libhello.a拷貝到/usr/lib目錄下,作為一個系統共享的靜態鏈接庫
[root@localhost main5]#gcc -o hello hello.c -lhello
//將hello.c編譯為可執行程序hello,這個過程用到了-lhello選項,這個選項告訴gcc編譯器到/usr/lib目錄下去找libhello.a的靜態鏈接庫
以上的過程類似於windows下的lib靜態鏈接庫的編譯及調用過程。
方法二:將hello1.o和hello2.o組合成動態鏈接庫.so
[root@localhost main5]#gcc -c -fpic hello1.c hello2.c
//將hello1.c和hello2.c編譯成hello1.o和hello2.o,-c意為只編譯不鏈接,-fpic意為位置獨立代碼,指示編譯程序生成的代碼要適合共享庫的內容這樣的代碼能夠根據載入內存的位置計算內部地址。
[root@localhost main5]#gcc -shared hello1.o hello2.o -o hello.so
//將hello1.o和hello2.o組合為shared object,即動態鏈接庫
[root@localhost main5]#cp hello.so /usr/lib
//將hello.so拷貝到/usr/lib目錄下
[root@localhost main5]#gcc -o hello hello.c hello.so
//將hello.c編譯鏈接為hello的可執行程序,這個過程用到了動態鏈接庫hello.so

在這里要廢話幾句,其實一切的二進制信息都有其運作的機制,只要弄清楚了它的機制,並能夠實現之,則任何此時此刻無法想像之事都將成為現實。當然,這兩者之間的巨大鴻溝需要頂級的設計思想和頂級的代碼來跨越。

Ⅹ linux下如何手動編譯安裝bzip2庫

下載bzip2 下載地址:http://www.bzip.org/downloads.html
1>格式是*.tar.gz 解壓文件
tar -zxf bzip2-1.0.6.tar.gz 得到一個bzip2-1.0.6目錄
2>進入bzip2-1.0.6目錄
cd bzip2-1.0.6 //目錄視文件存放路徑而定
3>make -f Makefile-libbz2_so //-f 標志是使bzip2 根據另一個Makefile來編譯,就是Makefile-libbz2_so文件,創建一個動態的libbz.so庫文件,然後把bzip2工具連接到這個庫上
註:裝python的時候如果沒有這一步,python安裝不上bz2模塊
4>make && make install 此命令執行成功,就安裝完了
註:如果要重新安裝bzip2,要先執行:rm -vf /usr/bin/bz* 命令,不然make install 命令會失敗

熱點內容
w7將電腦文件如何共享文件夾共享文件夾 發布:2024-12-25 09:12:41 瀏覽:187
安卓系統中哪個軟體最耗電 發布:2024-12-25 08:38:44 瀏覽:824
ssrssql 發布:2024-12-25 08:38:41 瀏覽:953
ai定位腳本 發布:2024-12-25 08:33:35 瀏覽:956
炎黃解說我的世界中國伺服器 發布:2024-12-25 08:33:28 瀏覽:796
sql2008發布 發布:2024-12-25 08:27:09 瀏覽:342
如何用存檔開伺服器 發布:2024-12-25 08:23:27 瀏覽:713
安卓手機為什麼不顯示通知欄 發布:2024-12-25 08:21:15 瀏覽:906
解壓肚子疼 發布:2024-12-25 08:15:01 瀏覽:589
安卓怎麼屏幕不滅 發布:2024-12-25 08:05:55 瀏覽:966