CMake入門3之 靜態鏈結庫和動態鏈結庫

2021-10-13 18:19:21 字數 3114 閱讀 7765

目錄

目標: 環境

建立靜態和動態鏈結庫

檔案準備 構建

安裝靜態鏈結庫

使用靜態鏈結庫和動態庫

使用動態庫

使用靜態庫

構建靜態鏈結庫和動態鏈結庫,安裝到系統,寫乙個程式使用安裝的靜態鏈結庫。

ubuntu18

cmake version 3.17.3

新建demo5-lib資料夾,包含內容如下

parallels@lincoln:~/workspace/cmakedemo/demo5-lib$ ll

total 24

drwxrwxr-x 3 parallels parallels 4096 jan 2 21:03 ./

drwxrwxr-x 7 parallels parallels 4096 jan 2 20:38 ../

drwxrwxr-x 2 parallels parallels 4096 jan 2 21:03 build/

-rw-r--r-- 1 parallels parallels 550 jan 2 21:03 cmakelists.txt

-rw-r--r-- 1 parallels parallels 672 jan 2 20:56 dateutils.c

-rw-r--r-- 1 parallels parallels 115 jan 2 20:56 dateutils.h

build 是空目錄,用來做構建用

dateutils.h**

#ifndef demo_dateutils_h

#define demo_dateutils_h

//顯示當前時間

void shownow();

#endif //demo_dateutils_h

dateutils.c**

#include #include #include "dateutils.h"

void shownow()

cmakelists.txt

cmake_minimum_required(version 3.10)

project(demo5-lib)

#靜態庫

add_library(dateutils_static static dateutils.c)

#動態庫

add_library(dateutils_shared shared dateutils.c)

#指定靜態庫的名字是hello,要不然名字會和add_library的target一樣,也就是:dateutils_static

set_target_properties(dateutils_static properties output_name "hello")

#指定靜態庫的名字是hello,要不然名字會和add_library的target一樣,也就是:dateutils_shared

安裝到系統,以後可像使用系統庫的方式使用。

可以在最後看到安裝的路徑

新建demo6-use-lib資料夾,內容如下:

parallels@lincoln:~/workspace/cmakedemo/demo6-use-lib$ ll

total 20

drwxrwxr-x 3 parallels parallels 4096 jan 2 21:38 ./

drwxrwxr-x 8 parallels parallels 4096 jan 2 21:36 ../

drwxrwxr-x 3 parallels parallels 4096 jan 2 21:45 build/

-rw-r--r-- 1 parallels parallels 126 jan 2 21:38 cmakelists.txt

-rw-rw-r-- 1 parallels parallels 78 jan 2 21:36 main.c

main.c

#include int main()
cmakelists.txt

cmake_minimum_required(version 3.10)

project(demo6-use-lib)

add_executable(main main.c)

#使用連線庫dateutil

target_link_libraries(main dateutil)

構建

執行執行報錯,使用ldd檢視找不到庫檔案

檢視檔案確實存在:靜態庫libdateutil.a和 動態庫 libdateutil.so

而且能看出缺省使用的是動態庫

遇到這種問題,可以使用ldconfig更新下庫的快取檔案

修改cmakelists.txt中的 

target_link_libraries(main dateutil) 為 target_link_libraries(main dateutil.a)  備註:也可以使用 dateutil.so顯示使用動態庫
重新編譯執行後,使用ldd已經看不到動態鏈結庫了。也能正常執行。

靜態鏈結庫和動態鏈結庫

其實再vc中,我們所用得所有api函式都封裝再下列三個dll檔案中 kernel32.dll 用於管理記憶體,程序和執行緒得各個函式 user32.dll 用於執行使用者介面任務,如視窗的建立和訊息的傳遞的各個函式 gdi32.dll 用於顯示文字和畫圖的各個函式 動態鏈結庫 我們再使用動態庫的時候...

靜態鏈結庫和動態鏈結庫

靜態鏈結庫 win32 static library 呼叫libtest.lib 動態dll win32 dynamic link library 跟librest的生成是一樣的 動態呼叫 成的.lib 和.dll 檔案拷入dllcall 工程所在的路徑,dllcall 執行下列 dll 中匯出函式...

靜態鏈結庫和動態鏈結庫

以前的時候寫過這方面的部落格,當時寫的時候都覺得已經懂了。今天閒著沒事幹,和咚哥他們去大華校招筆試遇到了這個問題。我突然間發現sdk沒寫三個月,把dll都忘記了。回來看了下,複習下。以前寫過程式的裝載和鏈結的部落格,那是os上面比較理論的。實際用函式庫的時候主要分為,靜態庫和動態庫,這裡就簡簡單單地...