cmake:生成靜態庫和動態庫

Ocean&&Star發表於2020-12-26

有時我們只需要編譯出動態庫,靜態庫,然後等著讓其它程式去使用。讓我們看下這種情況該如何使用cmake

實踐

編寫程式碼

專案結構如下:
在這裡插入圖片描述

/*
** testFunc.c
*/

#include <stdio.h>
#include "testFunc.h"

void func(int data)
{
	printf("data is %d\n", data);
}
/*
** testFunc.h
*/

#ifndef _TEST_FUNC_H_
#define _TEST_FUNC_H_

void func(int data);

#endif


最外層的CMakeLists.txt內容如下:

cmake_minimum_required (VERSION 2.8)

project (demo)

#向當前工程新增存放原始檔的子目錄
add_subdirectory (lib_testFunc)

lib_testFunc目錄下的CMakeLists.txt如下:

aux_source_directory (. SRC_LIST)

# 使用${SRC_LIST}為原材料生成一個叫做testFunc_shared 的動態庫
add_library (testFunc_shared SHARED ${SRC_LIST})
# 使用${SRC_LIST}為原材料生成一個叫做testFunc_static 的靜態庫
add_library (testFunc_static STATIC ${SRC_LIST})

# 將testFunc_shared 重新命名為 libtestFunc.so
set_target_properties (testFunc_shared PROPERTIES OUTPUT_NAME "testFunc")
# 將testFunc_static  重新命名為 libtestFunc.a
set_target_properties (testFunc_static PROPERTIES OUTPUT_NAME "testFunc")

# 設定 庫檔案的預設輸出路徑
set (LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

命令:

  • add_library: 生成動態庫或靜態庫(第1個引數指定庫的名字;第2個引數決定是動態還是靜態,如果沒有就預設靜態;第3個引數指定生成庫的原始檔)
  • set_target_properties: 設定輸出的名稱,還有其它功能,如設定庫的版本號等等

預定義變數:

  • LIBRARY_OUTPUT_PATH: 庫檔案的預設輸出路徑,這裡設定為工程目錄下的lib目錄

編譯

現在,讓我們進入build目錄下執行cmake …,成功後再執行make:

在這裡插入圖片描述

cd到lib目錄下進行檢視,發現已經成功生成了動態庫和靜態庫,
在這裡插入圖片描述

ps:可以看出前面使用set_target_properties重新定義了庫的輸出名字,如果不用set_target_properties也可以,那麼庫的名字就是add_library裡定義的名字,只是我們連續2次使用add_library指定庫名字時,這個名字不能相同,而set_target_properties可以把名字設定為相同,只是最終生成的庫檔案字尾不同,這樣相對來說會好看點。

理論

語法

add_library(<name> [STATIC | SHARED | MODULE]
            [EXCLUDE_FROM_ALL]
            [source1] [source2] [...])
  • <name>表示庫檔案的名字,該庫檔案會根據命令裡列出的原始檔來建立。
  • [STATIC | SHARED | MODULE]庫檔案的型別:
    • SHARED,動態庫
    • STATIC,靜態庫
    • MODULE,在使用 dyld 的系統有效,如果不支援 dyld,則被當作 SHARED 對待。
  • EXCLUDE_FROM_ALL:這個庫不會被預設構建,除非有其他的元件依賴或者手工構建。
  • [source1] [source2] [...]:指定生成庫的原始檔

總結

命令總結:

命令說明示例
add_library生成動態庫或靜態庫add_library (testFunc_shared SHARED ${SRC_LIST})
set_target_properties設定輸出的名稱set_target_properties (testFunc_shared PROPERTIES OUTPUT_NAME "testFunc")

預定義變數總結:

預定義變數說明
LIBRARY_OUTPUT_PATH庫檔案的預設輸出路徑

相關文章