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
- 靜態庫生成
- Linux 依賴動態庫 / 靜態庫的動態態庫 / 靜態庫Linux
- 動態庫和靜態庫的區別
- 靜態庫與動態庫
- VS下生成與配置靜態庫與動態庫(一)
- Linux下的靜態庫、動態庫和動態載入庫Linux
- Windows靜態庫和動態庫的建立和使用Windows
- iOS動態庫和靜態庫的運用iOS
- Linux下的共享庫(動態庫)和靜態庫Linux
- 動靜態庫
- 一、靜態庫和動態庫,Makefile專案管理專案管理
- android下java的靜態庫和動態庫AndroidJava
- 在Linux中建立靜態庫和動態庫Linux
- Linux 中的靜態庫和動態庫簡介及生成過程示例Linux
- iOS中的動態庫,靜態庫和framework介紹iOSFramework
- 簡述Linux下的靜態庫和動態庫Linux
- Linux靜態庫和動態庫學習總結Linux
- Linux環境下建立靜態庫和動態庫Linux
- clion 《cmake自定義靜態庫後,生成的exe無法執行》
- Linux 靜態庫生成指南Linux
- Linux共享庫、靜態庫、動態庫詳解Linux
- Android NDK祕籍--淺析靜態庫和動態庫Android
- Xcode新增Shell指令碼打包靜態庫和動態庫XCode指令碼
- 動態連結庫和靜態連結庫的區別
- 動態連結庫與靜態連結庫
- 菜鳥教程——iOS動態庫與靜態庫iOS
- linux下的靜態庫與動態庫Linux
- iOS 靜態庫(.a, .framework) 動態庫(.framework, dylib)iOSFramework
- ios靜態庫與動態庫的區別iOS
- cmake 連結動態連結庫
- Linux 靜態庫生成及呼叫Linux
- Linux下靜態庫生成指南Linux
- 動態庫的生成和使用(二)
- linux 動態庫 靜態庫 函式覆蓋Linux函式
- C++靜態庫與動態庫深入研究C++
- 靜態庫和動態庫的製作以及Bundle資原始檔的使用