[cmake] 制作一个静态库archive

来源:互联网 发布:js定义数组的方法 编辑:程序博客网 时间:2024/06/06 19:34
学习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_Hvoid 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_staticSET_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}/binLIBRARY DESTINATION lib #如果目标TARGETS中的某个目标是动态库so,就安装到${CMAKE_INSTALL_PREFIX}/libARCHIVE 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.oLinking C static library libcore.a[100%] Built target core_static
依然ok,最后执行

make install
输出

[100%] Built target core_staticInstall 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了