gcc學習 二 第二版

2021-09-07 11:01:42 字數 2559 閱讀 6758

1、概要

在使用c語言和其它語言進行程式設計的時候,我們須要標頭檔案來提供對常數的定義和對系統及庫函式呼叫的宣告。

庫檔案是一些預先編譯好的函式集合,那些函式都是依照可重用原則編寫的。它們通常由一組互相關聯的用來完畢某項常見工作的函式構成。比方用來處理螢幕顯示情況的函式(ncurses庫)和資料庫訪問例程(dbm庫)等。

2、使用庫的長處:

1)模組化開發

2)可重用性

3)可維護性

3、標頭檔案與庫檔案的位置

/usr/include及其子資料夾底下的include資料夾

/usr/local/include及其子資料夾底下的include資料夾 

4、使用外部庫【-i選項】

//例程

#include #include int main()

編譯: gcc -wall calc.c -o calc -lm

#-lm表示要鏈結libm.so或者libm.a庫檔案

1、概要

靜態庫(.a):程式在編譯鏈結的時候把庫的**鏈結到可執行檔案裡。程式執行的時候將不再須要靜態庫。靜態庫占用磁碟空間較大。

共享庫(.so/.sa):程式在執行的時候才去鏈結共享庫的**。多個程式可共享使用庫的**。[近期的linux[centos 6.4]版本號在/usr以及/lib資料夾下已經找不到.a檔案的蹤影了]

2、共享庫的長處:

在可執行檔案開始執行曾經,外部函式的機器碼由作業系統從磁碟上的該共享庫中拷貝到記憶體中,這個過程稱為動態鏈結(dynamic linking

) 共享庫能夠在多個程式間共享,所以動態鏈結使得可執行檔案更小,節省了磁碟空間。

作業系統採用虛擬記憶體機制同意物理記憶體中的乙份共享庫被要用到該庫的全部程序共用,節省了記憶體和磁碟空間。

-能夠簡單的覺得將多個.o檔案打包到一起,就生成了靜態庫

1)gcc -c hello_fn.c

#同gcc -wall -c hello_fn.c -o hello_fn.o

2)ar rcs libhello.a hello_fn.o search.o

#arar是gnu歸檔工具。rcs表示(replace and create),相當於將將.o檔案打包成為.a檔案,而且.o檔案能夠有多個

#將各個模組編譯,鏈結生成可執行檔案【方式一】

4)gcc -wall -l. main.c -o main -lhello

#-l.表示在當前資料夾搜尋庫檔案,-lhello[省略的lib],此時

即使刪除靜態庫libhello.a也可執行m

ain檔案【方式二】

1)從左到右搜尋-i -l指定的資料夾。

2)由環境變數指定的資料夾

能夠定義c_include_path/cpp_include_path(標頭檔案搜尋路徑)、library_path(庫檔案搜尋路徑)儲存在~/.bash_profile中,另在ubuntu系統中,也能夠將這些定義存放在~/.bashrc中

3)由系統指定的資料夾:/usr/include,/usr/lib等

gcc -shared -fpic hello_fn.o -o hello_fn.so

說明:1)shared表示生成共享庫

2)-fpic表示生成位置無關碼(position independent code)

3)庫的命名規則:lib***.so[.版本號號]

1)gcc main.o -o main –l. -lhello

#該命令與使用靜態庫的命令同樣,可是,在共享庫與靜態庫共存的情況下,優先使用共享庫

l:鏈結共享庫,只要庫名就可以(去掉lib以及版本號號)

l:鏈結庫所在的路徑.

2)執行共享庫

法1)拷貝.so檔案到系統共享庫路徑下,一般指/usr/lib

法2)在~/.bash_profile檔案裡,配置ld_library_path變數

export ld_library_path=.:$ld_library_path

. ~/.bash_profile

法3)配置/etc/ld.so.conf。配置完畢後呼叫ldconfig更新ld.so.cache

3)ldd命令:用於檢視程式執行時須要載入的共享庫

Makefile學習 一 第二版

1 make 利用 make 工具能夠自己主動完畢編譯工作。這些工作包含 假設僅改動了某幾個原始檔,則僅僅又一次編譯這幾個原始檔 make通過比對對應的.c檔案與.o檔案的時間 假設某個標頭檔案被改動了,則又一次編譯全部包含該標頭檔案的原始檔。利用這樣的自己主動編譯可大大簡化開發工作,避免不必要的又...

array c 實現,第二版

include include include include using namespace std namespace mylib array const array coll alloc coll.alloc size coll.size ia null array const pointer...

Effective Java 中文第二版

第2章 建立和銷毀物件 第1條 考慮用靜態工廠方法代替構造器 第2條 遇到多個構造器引數時要考慮用構建器 第3條 用私有構造器或者列舉型別強化singleton屬性 第4條 通過私有構造器強化不可例項化的能力 第5條 避免建立不必要的物件 第6條 消除過期的物件引用 第7條 避免使用終結方法 第3章...