1.歸檔舉例
a:定義乙個c語言標頭檔案:foo.h
#ifndef __foo_h__
#define __foo_h__
void show(int i);
#endif
b:定義乙個c語言原檔案:foo.c
#include
void show(int i)
c語言中,[color=red].c檔案最終要麼成乙個可執行檔案(必須要有main函式),要麼成了乙個動態連線檔案(.so)[/color],中間轉換過程:
第一步:.c編譯成.o(.o實際上就是乙個二進位制檔案,編譯時只找所依賴.h標頭檔案。不找所依賴的.a檔案)
第二步:.o歸檔成.a (一般都不會執行這步,除非自己寫的要給別人呼叫,特意執行這步)
第三步:.a連線成乙個可執行檔案(預設是a.out,一般通過-o引數改名成沒有字尾的)
[color=red] 第二步可以省略。[/color]
比如:[color=red]編譯: gcc -c foo.c (只是編譯)[/color]
注:如果直接gcc foo.c那麼預設是編譯並且連線,會報錯。因為這樣的話,就是要生成動態連線檔案(需要加引數-shared)或者是生成可執行檔案。因為生成動態連線檔案需要加引數-shared,所以確定是生成乙個可執行檔案。但是沒有main函式,所以就報錯了。
[color=red]歸檔:ar -r libfoo.a foo.o[/color]
注:可以把多個.o檔案歸檔,[color=red].a檔案一般以lib開頭[/color]
2.呼叫歸檔檔案舉例
建立乙個bar.c檔案
#include "foo.h"
int main()
[color=red]#include "foo.h" ""是指在當前目錄下找foo.h
如果是<>是指在系統所指定的目錄(如:/usr/include等) 再加上 c_include_path環境變數指定的目錄下找,預設是/usr/include/下找foo.h[/color]
因為有main函式(一般返回0表示正常),所以可以直接生成乙個可執行的檔案
[color=green]通過呼叫.a檔案來編譯並連線:gcc bar.c -lfoo -l.[/color](預設生成乙個a.out可執行檔案)
注: -lfoo 的意思是去找libfoo.a ,不是-llibfoo,不需要加lib
-l. 的意思是在[color=red]當前目錄下[/color]找libfoo.a,如果不指定就會去/usr/lib下找。-l只適用於靜態檔案,不適用於動態檔案
也可以通過-o引數改名字: gcc -o foo bar.c -lfoo -l.生成的foo就是乙個可執行的檔案。
3.生成動態連線庫舉例:
gcc -shared foo.c 預設生成的還是a.out,因為加的是-shared引數,所以生成的a.out是乙個動態連線庫檔案,所以最好改個名字gcc -o foo.so -shared foo.c
[color=green]通過動態連線庫編譯連線bar.c檔案
gcc -o bar bar.c foo.so[/color]
生成的bar檔案是個可執行檔案,可以通過[color=red]ldd bar命令檢視bar檔案所依賴的所有動態連線庫[/color]
比如:
[mahaibo@search2 c]$ ldd bar
foo.so (0x00e25000)
libc.so.6 => /lib/tls/libc.so.6 (0x0019a000)
/lib/ld-linux.so.2 (0x0017c000)
執行./bar會報異常:./bar: error while loading shared libraries: foo.so: cannot open shared object file: no such file or directory
因為執行的時候缺省會去/usr/lib下找動態連線庫,而foo.so不在/usr/lib目錄下。所以需要加個環境變數
export ld_library_path=/home/mahaibo/c
再執行即可.
[color=red]env 檢視所有環境變數
echo $ld_library_path 檢視某個環境變數[/color]
4.用c呼叫mysql:
因為使用者登入時缺省會去執行使用者目錄下的.bashrc檔案,所以需要把mysql給c呼叫的一些庫檔案新增到環境變數裡,所以需要在.bashrc檔案裡新增內容:
[color=red]export ld_library_path=$ld_library_path:/usr/lib/mysql[/color] 找動態連線庫目錄
[color=red]export c_include_path=$c_include_path:/usr/include/mysql[/color] 找頭檔案目錄
[color=red]export library_path=$library_path:/usr/lib/mysql[/color] 找.a檔案目錄
也可以在系統檔案裡新增:/etc/profile
連線mysql的乙個例項:
#include
#include
int main() else }}
mysql_close(conn);
return 0;
}
C語言筆記(C )
結構體,類在定義時沒分配空間,用其定義變數時才會分配空間,所以c語言在的結構體不用有靜態型別,因為靜態型別在資料段,而如果在函式用用結構體定義變數,這變數在棧中,這樣就衝突了,但在c 中有相應的機制處理些問題。c 的cin.get 不讀取緩衝區中的回車字元,而cin.getline 將緩衝區中的回來...
C語言 C語言複習筆記
為什麼要學c語言?1972年,美國貝爾實驗室的 d.m.ritchie 在b語言的基礎上最終設計出了一種新的語言,他取了bcpl的第二個字母作為這種語言的名字,這就是c語言。總所周知,任何東西的盛行都只是乙個階段,語言也是如此。但是,c語言是個例外,乙個矗立了半個世紀的語言,其中好壞,我想應該不難了...
C語言筆記
1.換行問題導致與預期效果會不一樣 2.與 的錯誤,成功用 0來表示 3.編譯器分解符號按照從左到右分解 利用貪心演算法4.這樣也可以輸出。5.ga 與 ga 區別 ga 編譯器的處理會不一樣,vc 是後乙個覆蓋前乙個,從左向右 6.int p,a p的值為int,a的值為int,所以p為int指標...