c語言筆記

2021-08-29 12:42:57 字數 2799 閱讀 2797

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指標...