除使用 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...