CMake--靜態庫與動態庫構建


小結內容

  • 建立一個靜態庫和動態庫,提供 HelloFunc 函數供其他程序編程使用, HelloFunc 向終端輸出Hello World 字符串。
  • 安裝頭文件與共享庫。

1.代碼與CMakeList.txt文件編寫

首先建立 t3 目錄,用於存放本節涉及到的工程
t3目錄下創建lib目錄用來存代碼

在 t3 目錄下建立 CMakeLists.txt ,

PROJECT(HELLOLIB)
ADD_SUBDIRECTORY(lib)
#SET(LIBRARY_OUTPUT_PATH < 路徑 >) #指定庫的生成位置。

在 lib 目錄下建立兩個源文件 hello.c 與 hello.h
hello.c 內容如下:

#include "hello.h"
void HelloFunc()
{
    printf("Hello Worldn");
}

hello.h 內容如下:

#ifndef HELLO_H
#define HELLO_H
#include <stdio.h>
void HelloFunc();
#endif

在 lib 目錄下建立 CMakeLists.tx

SET(LIBHELLO_SRC hello.c)
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})		#添加動態庫
#ADD_LIBRARY(hello STATIC ${LIBHELLO_SRC}) 		#添加靜態庫
#ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})	
#SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")   	#更改靜態庫輸出名字
#GET_TARGET_PROPERTY(OUTPUT_VALUE hello_static OUTPUT_NAME)		#獲取靜態庫輸出名字
#MESSAGE(STATUS “This is the hello_static OUTPUT_NAME:”${OUTPUT_VALUE})
#SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)		#設置動態庫版本號
#INSTALL(TARGETS hello hello_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib) #安裝靜態庫與動態庫
#INSTALL(FILES hello.h DESTINATION include/hello) #安裝頭文件

2.編譯動態庫與靜態庫:

仍然采用 out-of-source 編譯的方式,按照習慣,我們建立一個 build 目錄,在 build 目錄中

$cmake ..
$make

可以在 lib 目錄得到一個 libhello.so

3.指令解析

ADD_LIBRARY

ADD_LIBRARY(libname [SHARED|STATIC|MODULE]
[EXCLUDE_FROM_ALL]
source1 source2 ... sourceN)

1)第一個參數為庫的名字,不需要寫全 libhello.so ,只需要填寫 hello 即可, cmake 系統會自動為你生成libhello.X。
2)類型有三種 :

  • SHARED ,動態庫
  • STATIC ,靜態庫
  • MODULE ,在使用 dyld 的系統有效,如果不支持 dyld ,則被當作 SHARED 對待。

3)EXCLUDE_FROM_ALL 參數的意思是這個庫不會被默認構建,除非有其他的組件依賴或者手工構建。

SET_TARGET_PROPERTIE

SET_TARGET_PROPERTIES(target1 target2 ...
PROPERTIES prop1 value1
prop2 value2 ...)

1)這條指令可以用來設置輸出的名稱,對於動態庫,還可以用來指定動態庫版本和 API 版本。
與他對應的指令是:

GET_TARGET_PROPERTY(VAR target property)

來獲取target屬性。

2)這條指令同樣可以設置動態庫版本號

SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)
  • VERSION 指代動態庫版本
  • SOVERSION 指代 API 版本

將上述指令加入 lib/CMakeLists.txt 中,重新構建看看結果。
在 build/lib 目錄會生成:
libhello.so.1.2
libhello.so.1->libhello.so.1.2
libhello.so ->libhello.so.1

install

將 libhello.a, libhello.so.x 以及 hello.h 安裝到系統目錄,才能真正讓其他人開發使用,在本例中利用上一節了解到的 INSTALL 指令,我們向 lib/CMakeLists.txt 中添加如下指令:

INSTALL(TARGETS hello hello_static
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)
INSTALL(FILES hello.h DESTINATION include/hello)

通過終端執行:

$cmake -DCMAKE_INSTALL_PREFIX=/usr ..
$make
$sudo make install

我們就可以將頭文件和共享庫安裝到系統目錄 /usr/lib 和 /usr/include/hello 中了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM