Linux系統下cmake生成動態庫 靜態庫。

2021-10-02 03:58:33 字數 2995 閱讀 3379

動態庫是在程式的執行階段加入到源**的在程式的編譯鏈結階段只會生成乙個小小的表,用來記錄呼叫動態庫的位址。形象地講,可執行**和動態庫各是各的,是分開的。只有在程式開始執行後,程式才會去找動態庫,然後一起工作。

由動態庫的工作原理可知,程式與動態庫的關聯性極強。當程式執行時必須有動態庫存在。如果執行環境中不包含動態庫,那麼程式將無法執行。同時這樣帶來了乙個好處,動態庫實現了程式之間的資源共享(有時候動態庫也被稱為共享庫)。假設乙個動態庫大小為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的附...