cmake:生成靜態庫和動態庫
- 此文為:輕鬆入門cmake系列教程
- 下一篇:我們將說明如何連結庫
有時我們只需要編譯出動態庫,靜態庫,然後等著讓其它程式去使用。讓我們看下這種情況該如何使用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 | 庫檔案的預設輸出路徑 |
相關文章
- CMake和靜態庫順序
- ios靜態庫和動態庫iOS
- 靜態庫生成
- 靜態庫與動態庫
- android下java的靜態庫和動態庫AndroidJava
- iOS動態庫和靜態庫的運用iOS
- 一、靜態庫和動態庫,Makefile專案管理專案管理
- 簡述Linux下的靜態庫和動態庫Linux
- 動靜態庫
- Linux共享庫、靜態庫、動態庫詳解Linux
- Android NDK祕籍--淺析靜態庫和動態庫Android
- iOS中的動態庫,靜態庫和framework介紹iOSFramework
- linux下的靜態庫與動態庫Linux
- Linux 靜態庫生成及呼叫Linux
- clion 《cmake自定義靜態庫後,生成的exe無法執行》
- [Linux]動靜態庫Linux
- linux 動態庫 靜態庫 函式覆蓋Linux函式
- 動態連結庫與靜態連結庫
- cmake 連結動態連結庫
- 動態庫的生成和使用(二)
- 筆記: 判斷lib庫是動態庫還是靜態庫筆記
- 靜態庫和動態庫的製作以及Bundle資原始檔的使用
- linux下靜態連結庫和動態連結庫的區別有哪些Linux
- Android NDK祕籍--編譯靜態庫、呼叫靜態庫Android編譯
- 動態連結庫的生成和使用(二)
- iOS 靜態庫 與私有庫iOS
- 關於MNN工程框架編譯出來的靜態庫和動態庫的使用框架編譯
- Android:JNI與NDK(二)交叉編譯與動態庫,靜態庫Android編譯
- iOS - 靜態庫.a 和 framework 詳解iOSFramework
- 偽靜態、靜態和動態的區別
- 在AndroidStudio下使用cmake編譯出靜態連結庫的方法Android編譯
- C靜態庫的建立與使用--為什麼要引入靜態庫?
- 封裝動態庫dll與靜態庫lib(原理及簡單例項)封裝單例
- iOS的Framework靜態庫iOSFramework
- 靜態資源公共庫
- freemarker根據靜態模板和動態模板生成PDF與Word
- 靜態路由和動態路由路由
- 靜態代理和動態代理