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
⑵ arm-linux-gcc怎麼編譯自己寫的頭文件
linux gcc編譯c文件頭文件
linux gcc編譯c文件頭文件,使用GCC編譯器編譯C語言
凶豬下山
轉載
關注
0點贊·1047人閱讀
GCC編譯C源代碼有四個步驟:預處理—->編譯—->匯編—->鏈接。
可以利用GCC的參數來控制執行的過程,這樣就可以更深入的了解編譯C程序的過程。
下面將通過對一個程序的編譯來演示整個過程。
#include
int main()
{
printf("happy new year!\n");
return 0;
}
1:預處理:編譯器將C程序的頭文件編譯進來,還有宏的替換,可以用gcc的參數-E來參看。
預處理 命令:gcc -E hello.c -o hello.i
作用:將hello.c預處理輸出hello.i
2:編譯:這個階段編譯器主要做詞法分析、語法分析、語義分析等,在檢查無錯誤後後,把代碼翻譯成匯編語言。可用gcc的參數-S來參看。
編譯器(ccl)將文本文件hello.i 翻譯成文本文件hello.s, 它包含一個匯編語言程序。匯編語言程序中的每條語句都以一種標準的文本格式描述了一條低級機器語言指令。
編譯命令:gcc -S hello.i -o hello.s
作用:將預處理輸出文件hello.i匯編成hello.s文件
3:匯編:把編譯階段生成的.s 文件轉換為二進制目標代碼。可用gcc的參數-c來參看。匯編器(as)將hello.s翻譯成機器語言指令,把這些指令打包成可重定位目標程序的格式, 並將結果保存在目標文件hello.o中。hello.o文件是一個二進制文件,它的位元組編碼是機器語言。
匯編 命令:gcc -c hello.s -o hello.o
作用:作用:將匯編輸出文件hello.s編譯輸出hello.o文件
4:鏈接:把obj文件鏈接為可執行的文件:鏈接器(ld)負責.o文件的並入。結果就是hello文件,它是一個課執行的目標文件,可以載入到存儲器後由系統調用。
鏈接命令:gcc hello.o -o hello
一步操作的話是: (-o必須在hello之前 )
$gcc hello.c -o hello
$./hello或者:(會默認生成a.out文件)
$gcc hello.c
$./a.out
⑶ linux如何編譯oracle存儲過程
在筆者的一個銀行項目中,我接到編寫Oracle存儲過程的任務,我是程序員,腦袋裡只有一些如何使用CALLABLE介面調用存儲過程的經驗,一時不知如何下手,我查閱了一些資料,通過實踐發現編寫ORACLE存儲過程是非常不容易的工作,即使上路以後,調試和驗證非常麻煩。簡單地講,Oracle存儲過程就是存儲在Oracle資料庫中的一個程序。
一.概述
Oracle存儲過程開發的要點是:
◆使用Notepad文本編輯器,用OraclePL/SQL編程語言寫一個存儲過程;
◆在Oracle資料庫中創建一個存儲過程;
◆在Oracle資料庫中使用SQL*Plus工具運行存儲過程;
◆在Oracle資料庫中修改存儲過程;
◆通過編譯錯誤調試存儲過程;
◆刪除存儲過程;
二.環境配置
包括以下內容:
◆一個文本編輯器Notepad;
◆OracleSQL*Plus工具,提交OracleSQL和PL/SQL語句到Oracledatabase。
◆Oracle10gexpress資料庫,它是免費使用的版本;
需要的技巧:
◆SQL基礎知識,包括插入、修改、刪除等
◆使用Oracle'sSQL*Plus工具的基本技巧;
◆使用Oracle'sPL/SQL編程語言的基本技巧;
三.寫一個存儲過程
存儲過程使用Oracle'sPL/SQL程序語言編寫,讓我們寫一個什麼工作都不做的存儲過程,我們可以編譯和運行它而不用擔心會對資料庫產生任何損害。
在Notepad,寫下:IS
BEGIN
NULL;
END;
把文件存為skeleton.sql.
讓我們一行行遍歷這個存儲過程:
1
2IS
3BEGIN
4NULL;
5END;
行1:
CREATEORREPLACEPROCEDURE是一個SQL語句通知Oracle資料庫去創建一個叫做skeleton存儲過程,如果存在就覆蓋它;
行2:
IS關鍵詞表明後面將跟隨一個PL/SQL體。
行3:
BEGIN關鍵詞表明PL/SQL體的開始。
行4:
NULLPL/SQL語句表明什麼事都不做,這句不能刪去,因為PL/SQL體中至少需要有一句;
行5:
END關鍵詞表明PL/SQL體的結束
四.創建一個存儲過程
SQL語句CREATEORREPLACEPROCEDURE在Oracle資料庫中創建、編譯和保存一個存儲過程。
從Window打開SQL*Plus並且從SQL*Plus登錄到你的資料庫;打開skeleton.sql文件.
在SQL>命令提示符下輸入以下命令:
SQL>@skeleton
SQL>/
SQL*Plus裝載skeleton.sql文件的內容到SQL*Plus緩沖區並且執行SQL*Plus語句;SQL*Plus會通知你存儲過程已經被成功地創建。
現在你的存儲過程被創建,編譯和保存在你的Oracle資料庫,我們可以運行它。
五.運行一個存儲過程
從SQL*Plus命令行提示符運行你的存儲過程使用EXECUTE命令,如下:
SQL>EXECUTEskeleton;
SQL*Plus輸出一下信息確信存儲過程成功執行:PL/.
你也可以在一個無名PL/SQL塊內運行你的存儲過程,在SQL*Plus命令提示符下,它看起來像:
SQL>BEGIN
2SKELETON;
3END;
4/
現在我們已經運行了我們的存儲過程,我們如何修改它呢?
六.修改一個存儲過程
讓我們寫一個輸出字元串「HelloWorld!」的存儲過程,用Notepad打開你的skeleton.sql文件,.用DBMS_OUTPUT.PUT_LINE過程調用去替換NULL語句,如下所示:IS
BEGIN
DBMS_OUTPUT.PUT_LINE('HelloWorld!');
END;
保存到文件skeleton.sql.
從SQL*Plus命令行,打開文件skeleton.sql.
SQL>@skeleton
SQL>
1
2IS
3BEGIN
4DBMS_OUTPUT.PUT_LINE('HelloWorld!');
5*END;
SQL>/
SQL*Plus通知你存儲過程成功創建並輸出提示信息:Procerecreated.
SQL>
用EXECUTE命令運行你的存儲過程:
SQL>EXECUTEskeleton;
SQL*Plus顯示存儲過程運行成功:PL/.
我們想要的輸出字元串"HelloWorld!"沒有出來,在顯示一個DBMS_OUTPUT.PUT_LINE結果前需要運行一個SET命令,在SQL*Plus命令行提示符,鍵入:
SQL>SETSERVEROUTPUTON
再次執行你的存儲過程:
SQL>EXECUTEskeleton;
現在結果輸出了:HelloWorld!
PL/.
七.調試一個存儲過程
當調試一個存儲過程時,遵循一樣的步驟,修改SQL文件,創建存儲過程,執行存儲過程,根據編譯器反饋的出錯信息進行修改,這一步是非常繁瑣的,需要依靠經驗。
在實際的商用存儲過程的開發調試過程中,由於涉及很多表、類型、游標、循環、條件等復雜的邏輯,和PL/SQL語句的靈活運用,編譯時會產生很多錯誤提示信息,程序員在根據這些錯誤信息定位,進行修正,再編譯最後得到正確的結構;
八.放棄一個存儲過程
如果在資料庫中你不在需要一個存儲過程你可以刪除它,SQL語句DROPPROCEDURE完成從資料庫中刪除一個存儲過程,DROPPROCEDURE在SQL中被歸類為數據定義語言(DDL)類操作,其他的例子有CREATE,ALTER,RENAME和TRUNCATE。.
在SQL*Plus命令提示符下,使用DROPPROCEDURESQL語句刪除你的叫做skeleton的存儲過程:
SQL>DROPPROCEDUREskeleton;
SQL*:
Proceredropped.
總結
本文詳細討論了如何使用Oracle工具開發Oracle商用存儲過程的步驟。最後在存儲過程的使用中可能是程序直接調用,也可能被觸發器調用
⑷ linux下將程序中用到的第三方庫編譯到自己的程序中
舉例,頭文件名 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文件。
⑸ linux環境下編譯so庫和編譯可執行文件
gcc -fPIC -shared caculate.c -o libcaculate.so
-fPIC 壓制警告
-shared 動態庫
-o 生成目標的文件名
caculate.c
gcc -rdynamic -o main main.c
-rdynamic 生成可執行文件
-o 目標文件名
main是linux環境下的一個可執行文件。
main.c
gcc -c main.c -o main.o
gcc -c minus.c -o minus.o
gcc -c mulit.c -o mulit.o
gcc -c plus.c -o plus.o
gcc main.o minus.o mulit.o plus.o -o myapp
⑹ 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 命令會失敗