最近又捣鼓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了