關於makefile:
如何生成動態鏈結庫和靜態鏈結庫,生成這些庫的作用是什麼?
無論靜態庫,還是動態庫,都是由
.o檔案建立的。
靜態庫檔名的命名規範是以lib為字首,緊接著跟靜態庫名,擴充套件名為.a。
例如:我們將建立的靜態庫名為myhello,則靜態庫檔名就是libmyhello.a。在建立和使用靜態庫時,需要注意這點。建立靜態庫用ar命令。
在系統提示符下鍵入以下命令將建立靜態庫檔案libmyhello.a。
# ar crv libmyhello.a hello.o
動態庫檔名命名規範和靜態庫檔名命名規範類似,也是在動態庫名增加字首lib,但其擴充套件名為.so。
例如:我們將建立的動態庫名為myhello,則動態庫檔名就是libmyhello.so。用gcc來建立動態庫。
在系統提示符下鍵入以下命令得到動態庫檔案libmyhello.so。
# gcc -shared -fpic -o libmyhello.so hello.o
也可以由.c檔案直接建立動態庫:gcc -shared -fpic -o libmyhello.so hello.c
我們照樣使用ls命令看看動態庫檔案是否生成。
如何使用靜態鏈結庫?
靜態庫製作完了,如何使用它內部的函式呢?只需要在使用到這些公用函式的源程式中包含這些公用函式的原型宣告,然後在用gcc命令生成目標檔案時指明靜態庫名,gcc將會從靜態庫中將公用函式連線到目標檔案中。注意,gcc會在靜態庫名前加上字首lib,然後追加副檔名.a得到的靜態庫檔名來查詢靜態庫檔案。
# gcc -o test test.c -l. -lmyhello
以上參考:
makefile命令引數-fpic作用是什麼?
當使用.so等類的庫時,當遇到多個可執行檔案共用這乙個庫時, 在記憶體中,這個庫就不會被複製多份,讓每個可執行檔案一對一的使用,而是讓多個可執行檔案指向乙個庫檔案,達到共用. 宗旨:節省了記憶體空間,提高了空間利用率.
參考:makefile命令引數-shared作用是什麼?
-shared
該選項指定生成動態連線庫
(讓聯結器生成
t型別的匯出符號表,有時候也生成弱連線
w型別的匯出符號),不用該標誌外部程式無法連線。相當於乙個可執行檔案
grep 命令使用小介紹
grep 為一過濾器,
它可自乙個或多個檔案中過濾出具有某個字串的行,
或是自標準輸入
過濾出具有某個字串的行。
fgrep 可將欲過濾的一群字串放在某乙個檔案中,
然後使用 fgrep 將包含有屬於這一群字
串的行過濾出來。
grep 與 fgrep 的用法如下:
grep [-nv] match_pattern file1 file2...。
fgrep [-nv] -f pattern_file file1 file2...。
-n 把所找到的行在行前加上行號列出
-v 把不包含 match_pattern 的行列出
match_pattern 所要搜尋的字串
-f 以 pattern_file 存放所要搜尋的字串
動態鏈結庫的特點與優勢 ?
首先讓我們來看一下,把庫函式推遲到程式執行時期載入的好處:
1. 可以實現程序之間的資源共享。
什麼概念呢?就是說,某個程式的在執行中要呼叫某個動態鏈結庫函式的時候,作業系統首先會檢視所有正在執行的程式,看在記憶體裡是否已有此庫函式的拷貝了。如果有,則讓其共享那乙個拷貝;只有沒有才鏈結載入。這樣的模式雖然會帶來一些「動態鏈結」額外的開銷,卻大大的節省了系統的記憶體資源。c的標準庫就是動態鏈結庫,也就是說系統中所有執行的程式共享著同乙個c標準庫的**段。
2. 將一些程式公升級變得簡單。使用者只需要公升級動態鏈結庫,而無需重新編譯鏈結其他原有的**就可以完成整個程式的公升級。windows 就是乙個很好的例子。
3. 甚至可以真正做到鏈結載入完全由程式設計師在程式**中控制。
程式設計師在編寫程式的時候,可以明確的指明什麼時候或者什麼情況下,鏈結載入哪個動態鏈結庫函式。你可以有乙個相當大的軟體,但每次執行的時候,由於不同的操作需求,只有一小部分程式被載入記憶體。所有的函式本著「有需求才調入」的原則,於是大大節省了系統資源。比如現在的軟體通常都能開啟若干種不同型別的檔案,這些讀寫操作通常都用動態鏈結庫來實現。在一次執行當中,一般只有一種型別的檔案將會被開啟。所以直到程式知道檔案的型別以後再載入相應的讀寫函式,而不是一開始就將所有的讀寫函式都載入,然後才發覺在整個程式中根本沒有用到它們。
儲存的地方是一樣的,不同之處在於它們的作用域不同
:全域性變數基本上在程式的任何地方都能被看到
而靜態區域性變數只能在其指定的範圍內被使用
比如
int i ; // 全域性變數
class c
void main()
全域性的,在main與winmain進入點之前startup碼幫助初始化。
區域性的,在宣告處初始化。
全域性變數是在它定義以後的**都可以訪問它。
靜態變數是只有在定義該變數的模組中才能訪問它。
靜態變數的作用域在本檔案內,不能擴充到其它檔案。
雖然全域性變數和靜態區域性變數都是以靜態儲存方式儲存的,但全域性變數的作用域是從定義開始到檔案結束,在作用域內的所有函式都是可見的,也就是說對作用域內的所有函式都可以使用,而靜態區域性變數雖然也是以靜態儲存方式儲存,但它的作用域只限定於定義的函式,對其它函式來說是不可見的,因而也不能使用.
變數可以分為全域性變數、靜態全域性變數、靜態區域性變數和區域性變數
按儲存區域分:全域性變數、靜態全域性變數和靜態區域性變數都存放在記憶體的全域性資料區,區域性變數存放在記憶體的棧區
按作用域分:全域性變數在整個工程檔案內都有效;靜態全域性變數只在定義它的檔案內有效;靜態區域性變數只在定義它的函式內有效,只是程式僅分配一次記憶體,函式返回後,該變數不會消失;區域性變數在定義它的函式內有效,但是函式返回後失效。
全域性變數和靜態變數如果沒有手工初始化,則由編譯器初始化為0。區域性變數的值不可知。
**如下:
#include extern int a;//變數宣告,不是定義
static int b=5;
void func1()
{ cout<
new和malloc的區別?
1,malloc與free是c++/c語言的標準庫函式,new/delete是c++的運算子。它們都可用於申請動態記憶體和釋放記憶體。
2,對於非內部資料型別的物件而言,光用maloc/free無法滿足動態物件的要求。
物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。
由於malloc/free是庫函式而不是運算子,不在編譯器控制許可權之內,不能夠把執行建構函式和析構函式的任務強加於malloc/free。
3,因此c++語言需要乙個能完成動態記憶體分配和初始化工作的運算子new,以乙個能完成清理與釋放記憶體工作的運算子delete。注意new/delete不是庫函式。
4,c++程式經常要呼叫c函式,而c程式只能用malloc/free管理動態記憶體
new 是個操作符,和什麼"+","-","="...有一樣的地位.
malloc是個分配記憶體的函式,供你呼叫的.
new是保留字,不需要標頭檔案支援.
malloc需要標頭檔案庫函式支援.
new 建立的是乙個物件,
malloc分配的是一塊記憶體.
new建立的物件你可以把它當成乙個普通的物件,用成員函式訪問,不要直接訪問它的位址空間
malloc分配的是一塊記憶體區域,就用指標訪問好了,而且還可以在裡面移動指標.
簡而言之:
new 是乙個操作符,可以過載
malloc是乙個函式,可以覆蓋
new初始化物件,呼叫物件的建構函式,對應的delete呼叫相應的析構函式
malloc僅僅分配記憶體,free僅僅**記憶體
以上來自:
構造雜湊函式的方法?
(1)平方取中法
(2)除餘法
(3)相乘取整法
(4)隨機數法
以上來自:
宣告和定義的區別?
乙個宣告就是乙個定義,除非
- 它宣告了乙個沒有詳細說明函式體的函式
- 它包含乙個extern定義符並沒有初始化或函式體
- 它是乙個包含在乙個類之內的資料成員的宣告
- 它是乙個類的宣告
- 它是乙個typedef的宣告
乙個定義就是乙個宣告,除非
- 它定義了乙個靜態成員函式
- 它定義了乙個成員函式
以上來自:
xml小問題集錦
1.密碼中就算只有數字,也要加引號 name username value root name password value 123456 否則報錯linenumber 15 columnnumber 36 與元素型別 value 相關聯的屬性 應有左引號。2.log4jd 中 代表的注釋必須換行寫...
Android小問題集錦
1.android head detached at x 解決方法 切回分支直接用git checkout 分支名 git checkout b 本地分支名 remotes origin 遠端分支名,這個命令是在本地建立乙個分支名,並且將遠端的分支引入到這裡,因為我本地已經有了這個分支名,直接用 g...
C 小問題集錦
摘要 在學習 c 語言程式設計中遇到的一些容易混淆出錯的問題,記錄下來備忘。c語言學習 小問題集錦 參考 章節 正文 一 陣列元素 a n 是 a n 還是 a n 1 在學習排序中,看到了一種寫法,a n 這個a n 到底是 a n 還是 a n 1 不用多說,上測試 include int ma...