cmake學習(一)靜態庫與動態庫構建

2021-08-03 16:36:47 字數 1427 閱讀 1724

(.so)共享庫,shared object:節省空間,在執行時去連線,如果執行機器上沒有這些庫檔案就不能執行。

(.a)靜態庫,archive:靜態庫和程式化為一體,不會分開。

通過 ldd命令可以檢視乙個可執行程式所依賴的的共享庫。

使用環境變數ld_library_directory可以指定共享庫位置

一、編譯共享庫:

add_library(hello shared $)

二、新增靜態庫

add_library(hello static $)

因為預設規則是不能有相同名字的共享庫與靜態庫,所以當生成靜態庫的時候(so字尾),共享庫會被刪除,因為只能允許乙個名字存在,相同名字的會被替代(hello),所以需要通過set_target_properties()來解決這個問題,例子:

set_target_properties(hello_static properties output_name "hello")

cmake在構建乙個target的時候,會刪除之前生成的target,一樣是通過設定set_target_properties(hello properties clean_direct_output 1)來達到目的

三、動態庫的版本號:

同樣是通過set_target_properties()來設定

set_target_properties(hello properties version 1.2 soversion 1)

version:動態庫版本

soversion:api版本

最後生成的結果是:

libhello.so.1.2

libhello.so.1->libhello.so.1.2

libhello.so->libhello.so.1

四、安裝:

install(targets hello hello_static 

library destination lib

archive destination lib)

install(targets hello.h

destination include/hello)

其他常用的屬性 permissions:設定許可權;rattern:設定正規表示式

summary:

add_library():新增乙個庫,共享庫,靜態庫,模組

set_target_properties():設定輸出名稱,版本號,解決相同target被刪除的問題

get_target_proeerties():與set功能相對

cmake編譯動態庫和靜態庫

cmake minimum required version 2.6 project hello 新增原始檔 aux source directory dir srcs 設定編譯引數 set cmake c flags g wall 新增標頭檔案路徑 include directories incl...

靜態庫與動態庫

linux下靜態庫 a 的例子 mylib.h 位於include資料夾下 ifndef mylib h define mylib h int add int a,int b endif mylib.cpp 位於lib資料夾中 include mylib.h int add int a,int b ...

靜態庫與動態庫

庫本質上是一種可執行的二進位制 可以被作業系統載入 linux和windows的庫是不相容的 庫可以分為靜態塊和動態庫,二者的不同點在於 被載入的時刻不同。靜態庫 在程式編譯時會被連線到目標 中,程式執行時不再需要改靜態庫,體積較大,一般應用與移植過程中在宿主機上編譯的 靜態庫檔名的命名規範是以li...