學習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了