CMake學習 二 生成鏈結庫

2021-10-02 08:16:34 字數 1605 閱讀 5460

除使用 add_executable 生成可執行檔案外,還可以使用 add_library 生成鏈結庫。

一、linux的鏈結庫

首先講一下 linux 的鏈結庫,就是一些函式**的二進位制形式,有動態與靜態兩種,動態通常用.so為字尾,靜態用.a為字尾。

靜態鏈結庫 .a

檔案的命名方式:「lib***.a」,庫名前加「lib」,字尾是「.a」,庫名是「***」。

靜態庫的**在編譯過程中已經被載入可執行程式,因此體積較大。

當要使用時,鏈結器會找出程式所需的函式,然後將它們拷貝到執行檔案,由於這種拷貝是完整的,所以一旦連線成功,靜態程式庫也就不再需要了。

動態鏈結庫(共享庫)

檔案命名方式:「lib***.so」,庫名前加「lib」,字尾是「.so」,庫名是「***」。

動態庫的**是在可執行程式執行時才載入記憶體的,在編譯過程中僅簡單的引用,因此**體積較小。

某個程式在執行中要呼叫某個動態鏈結庫函式的時候,作業系統首先會檢視所有正在執行的程式,看在記憶體裡是否已有此庫函式的拷貝了。如果有,則讓其共享那乙個拷貝;只有沒有才鏈結載入。在程式執行的時候,被呼叫的動態鏈結庫函式被安置在記憶體的某個地方,所有呼叫它的程式將指向這個**段。因此,這些**必須使用相對位址,而不是絕對位址。在編譯的時候,我們需要告訴編譯器,這些物件檔案是用來做動態鏈結庫的,所以要用位址無關**(position independent code (pic))。

注意:linux下進行連線的預設操作是首先連線動態庫,也就是說,如果同時存在靜態和動態庫,不特別指定的話,將與動態庫相連線。

二、建立鏈結庫

add_library

([static | shared | module]

[exclude_from_all]

[source1]

[source2 ...

])

三、乙個例子:

hello.c

#

include

inthello()

cmakelists.txt

# cmake最低版本要求

cmake_minimum_required

(version 3.5

)# 專案名稱

project

(test_3)

# 指定生成目標

add_executable

(test_3 main.c)

# 生成可執行檔案

# 這裡直接寫庫名稱 test_2 就可以,cmake 會自動新增字首 lib 和字尾 .a

add_library

(test_2 static hello.c)

編譯後的結果:(編譯方法同cmake學習(一)—— 最簡單的cmakelists.txt)

libtest_2.a即生成的靜態鏈結庫。

參考:

CMake配置工程鏈結庫

cmake是一款優秀的c c 專案構建工具。而c c 專案經常使用一些第三方庫,如boost luajit等。而在cmake下大致有3種方式將c c 庫引入工程。find package是cmake原生使用的庫查詢命令。使用方式如下 find package boost required find ...

cmake新增動態鏈結庫

如果使用gcc進行單個c檔案編譯的時候,有時候後面會需要新增如 l l之類的引數,如下 gcc o test test.c l usr local lib lopencv 這裡 l是制定動態庫的位置,l則是指定打算連線的動態庫名字。那麼在進行專案編譯的時候就需要通過cmake來通過cmakelist...

生成動態鏈結庫

fpic pic就是position independent code pic使.so檔案的 段變為真正意義上的共享 如果不加 fpic,則載入.so檔案的 段時,段引用的資料物件需要重定位,重定位會修改 段的內容,這就造成每個使用這個.so檔案 段的程序在核心裡都會生成這個.so檔案 段的copy...