[cmake] 製作一個靜態庫archive

學習cmake的原因:

最近又搗鼓cmake了,源於瀏覽github的時候,發現很多項目都是必須由cmake安裝,感覺是大勢所趨啊。同時也接觸了autotools,qmake,scons等其他的構建工作,不過感覺還是cmake簡單,高效。因爲,居然僅花了半天時間就成功的把項目由qmake切換到cmake了,還沒有什麼大錯誤,真是太神奇了。一開始看見cmake,很畏懼,因爲cmake的語句好抽象,難理解。但是,只要花上一段時間去認真的手把手地操練一遍,基本的項目配置就不是什麼大難題了。那些高級的cmake配置,我看是用的機會比較少。

就先以一個製作archive來開始吧。

目錄結構:

.
└── t1
    ├── build
    ├── CMakeLists.txt
    └── src
        ├── CMakeLists.txt
        ├── core.c
        └── core.h
今天就在t1目錄下進行操練。

src目錄就是我們放置源代碼的目錄,build目錄是執行cmake命令的目錄,而與src,build同級的CMakeLists.txt文件是整個項目的管理文件

代碼:

core.h

#ifndef CORE_H
#define CORE_H

void core_help();

#endif
簡單的不能再簡單的一個頭文件
core.c

#ifndef CORE_H
#	include "core.h"
#endif

#include <stdio.h>

void core_help()
{
	printf("my help\n");
}
依然如此簡單

src/CMakeLists.txt

AUX_SOURCE_DIRECTORY(. all_sources)#將當前目錄(.)下的所有源文件(c或者cpp)加入到變量all_sources中

ADD_LIBRARY(core_static ${all_sources})#我們期望使用變量all_sources中的文件去生成一個archive文件core_static

SET_TARGET_PROPERTIES(core_static PROPERTIES OUTPUT_NAME "core")#爲這個archive文件設置一個命令
                                                                #(設置了之後,生成的文件名就是libcore.a而不是libcore_static.a)

INSTALL(TARGETS core_static #可以在core_static後面以空格添加多個目標
	RUNTIME DESTINATION bin #如果目標TARGETS中的某個目標是2進制可執行程序,就安裝到${CMAKE_INSTALL_PREFIX}/bin
	LIBRARY DESTINATION lib #如果目標TARGETS中的某個目標是動態庫so,就安裝到${CMAKE_INSTALL_PREFIX}/lib
	ARCHIVE DESTINATION libstatic #如果目標TARGETS中的某個目標是靜態庫archive,就安裝到${CMAKE_INSTALL_PREFIX}/libstatic
)#在執行make install命令後,將期望的文件安裝到期望的目錄中去
 #CMAKE_INSTALL_PREFIX的值是什麼?請看下文
INSTALL(FILES core.h DESTINATION include)#同上,${CMAKE_INSTALL_PREFIX}/include
看起來,生成一個archive的所需要的語句很簡單。

外面的CMakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 2.6)#指定版本,若cmake版本低於2.6,直接報錯退出
PROJECT(CORE)#爲工程起個名字
ADD_SUBDIRECTORY(src constuct)#填加子目錄src,併爲它在構建後的目錄命名爲constuct。添加多個子目錄就有多個ADD_SUBDIRECTORY語句

執行:

在build目錄下執行

cmake -DCMAKE_INSTALL_PREFIX=. ..#在這兒指定了未來的安裝目錄爲執行cmake命令的當前目錄,而後面的..表示cmake要執行的CMakeLists.txt在上級目錄(out of source)
輸出

-- The C compiler identification is GNU 4.8.4
-- The CXX compiler identification is GNU 4.8.4
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/hu/project/test_cmake/t1/build
看見了很多done,表示沒什麼問題,接着執行

make

輸出

Scanning dependencies of target core_static
[100%] Building C object constuct/CMakeFiles/core_static.dir/core.c.o
Linking C static library libcore.a
[100%] Built target core_static
依然ok,最後執行

make install
輸出

[100%] Built target core_static
Install the project...
-- Install configuration: ""
-- Installing: /home/hu/project/test_cmake/t1/build/libstatic/libcore.a
-- Installing: /home/hu/project/test_cmake/t1/build/include/core.h
看到,安裝了我們期望的文件

看一下build目錄下的文件

CMakeCache.txt  CMakeFiles  cmake_install.cmake  constuct  include  install_manifest.txt  libstatic  Makefile

接下來就是如何使用archive了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章