動態庫是在程式的執行階段加入到源**的,在程式的編譯鏈結階段只會生成乙個小小的表,用來記錄呼叫動態庫的位址。形象地講,可執行**和動態庫各是各的,是分開的。只有在程式開始執行後,程式才會去找動態庫,然後一起工作。
由動態庫的工作原理可知,程式與動態庫的關聯性極強。當程式執行時必須有動態庫存在。如果執行環境中不包含動態庫,那麼程式將無法執行。同時這樣帶來了乙個好處,動態庫實現了程式之間的資源共享(有時候動態庫也被稱為共享庫)。假設乙個動態庫大小為2mb,乙個作業系統上執行了100個包含該動態庫的程式,顯然由於動態庫共享的關係,記憶體只需要騰出個2mb來存放該動態庫的副本就可以了(與上面某種方式形成了鮮明對比)。
可見動態庫的特點為:
1.動態庫在程式執行階段實現與源**的鏈結。
2.可執行程式本身與所需的庫關聯性極強,移植起來較為麻煩,需要考慮移植平台上是否擁有此庫。
3.相對節約了記憶體和儲存資源。如果需要更新動態庫,直接用新的動態庫把原先的替換掉就行了,不需要其他操作。應用程式的增量更新就是基於此原理。
ps:在windows平台上破解軟體或者修改軟體是不是經常要用新的dll檔案去代替原先的dll檔案呢?其實這就是動態庫的更新,顯然不需要修改程式的其他地方。
新建乙個資料夾,按下圖所示進行組織:
build資料夾:存放編譯生成的中間檔案。
lib資料夾:存放生成的靜態庫,動態庫。
lib_func資料夾:存放生成庫的原始庫**檔案。這裡為了方便,將上個cmake文章中的簡單**放了進去。
func1.c**如下,提供了乙個列印數字的函式:
#include
"func1.h"
#include
void
datashow
(int data)
func1.h**如下:
#ifndef _func1_h_
#define _func1_h_
extern
void
datashow
(int data)
;#endif
func2.c**如下,提供了乙個數字相加的函式:
#include
#include
"func2.h"
void
dataadd
(int a,
int b)
//列印兩個數字之和
func2.h**如下:
#ifndef _func2_h_
#define _func2_h_
extern
void
dataadd
(int a,
int b)
;#endif
// !_func2_h_
工程中有兩個cmakelists.txt。在工程根目錄的內容為:
cmake_minimum_required (version 2.8
)#cmake最低版本為2.8
project (demo)#工程名為demo
add_subdirectory (lib_func)#將lib_func這個資料夾設為子目錄
內容的前兩句好懂。第三句add_subdirectory (lib_func)
意為將lib_func
資料夾設定為子目錄。設定為子目錄會產生什麼效果呢?效果就是執行到第三句之後,cmake會自動去lib_func
資料夾下尋找cmakelists.txt,然後再執行那個cmakelists.txt。
也就是說,這個工程是先執行工程根目錄下的cmakelists.txt,再執行子目錄(lib_func)下的cmakelists.txt。兩個cmakelists.txt的關係是順序執行。
lib_func中的cmakelists.txt內容如下:
aux_source_directory
(. src_list)#將此目錄的原始檔集合稱為變數src_list
add_library
(funclib_shared shared $
)#庫的名稱,庫的型別,庫的原始檔(動態庫)
add_library
(funclib_static static $
)#庫的名稱,庫的型別,庫的原始檔(靜態庫)
set_target_properties
(funclib_shared properties output_name "funclib"
)#庫的名稱,庫的輸出名稱(動態庫)
set_target_properties
(funclib_static properties output_name "funclib"
)#庫的名稱,庫的輸出名稱(靜態庫)
set(library_output_path $
/lib)#庫的輸出路徑為工程根目錄下的lib資料夾。
由注釋可得,最終會生成2個同名稱的靜態庫與動態庫。
進入build資料夾,開啟埠。老辦法,先輸入cmake ..
,再輸入make
。
最後到lib資料夾下檢視,已經生成了乙個動態庫和乙個靜態庫。
Linux下cmake使用簡介
cmake好像都說比直接寫makefile牛一點,因為它可以自動生成makefile。專門針對檔案比較多的情況,要不是這幾天在用別人的 一大堆,我覺得用makefile也夠了,但是據說linux程式設計師必備技能啊,所以還是要學學這麼高階的東西。在源 目錄src中建立cmakelists.txt檔案...
Linux下CMake 安裝教程
cmake是乙個跨平台的自動化建構系統 其使用乙個名為 cmakelists.txt 的檔案來描述構建過程,可以產生標準的構建檔案,如 unix 的 makefile 或windows visual c 的 projects workspaces 檔案 cmakelists.txt 需要手工編寫,也...
Linux下cmake的安裝
ubuntu系統下 sudo apt get autoremove cmake但是此句指令是針對於通過sudo apt get install cmake 安裝的使用者。如果是從原始碼安裝,則首先到cmake的安裝目錄下找到install manifest.txt檔案,該檔案儲存了所有cmake的附...