cmake新手入门教程

linux 环境使用 cmake 编译大型项目

1.一个简单的实例

使用 cmake 编译大型项目非常方便,做个简单的记录。

建立一个目录 win,这里面是工程文件。win 的目录如下:

    win
    \-- CMakeLists.txt
    |-- build.sh
    |-- libs               外部库
    |-- src
        |-- CMakeLists.txt
        |-- common         公用头文件
        |-- win98          win98工程
        |   |-- CMakeLists.txt
        |   |-- main.cc
        |   |-- win98.h
        |   \-- win98.cc
        |
        |-- win2000        win2000工程
            |-- CMakeLists.txt
            |-- main.cc
            |-- win2000.h
            \-- win2000.cc

win、src、win98、win2000 四个目录下都有一个 CMakeLists.txt 文件,该文件是必须的,cmake 根据这个文件来生成 Makefile。

win98 的CMakeLists.txt 内容如下

    add_executable(win98
        main.cc
        win98.cc
      )

假设 win2000 加入了新的网络功能,链接时需要用到 network 这个库文件,那么需要在 CMakeLists.txt 中指明

    add_executable(robot
        main.cc
        win2000.cc
      )
    target_link_libraries(win2000 network)

src 目录下的 CMakeLists.txt 需要把它下属需要编译的目录都指定

    add_subdirectory(win98)
    add_subdirectory(win2000)

在 win 目录下的 CMakeLists.txt 文件内容复杂一点,下面是个简单的例子

    # 指定版本和项目名称
    cmake_minimum_required(VERSION 2.6)
    project(windows CXX)

    # 指定源码目录
    add_subdirectory(src)

在 win 目录下运行

    cmake .    后面有个点
    make

整个工程编译完成,在 win98 和 win2000 下面就可以得到执行文件。

2.结合 Shell 脚本

上面用到的方法已经可以顺利编译工程,有个问题是,编译产生的中间文件都在源代码目录下,让目录混乱,如果把中间文件放在其他目录,可以保证源代码目录下是整洁的。

假设中间目录是 wintemp 和 win 目录同级。在 win 目录下添加 build.sh 文件,内容是

    #!/bin/sh

    set -x

    SOURCE_DIR=`pwd`
    BINARY_DIR=`pwd`
    BUILD_DIR=${BUILD_DIR:-../wintemp}

    mkdir -p $BUILD_DIR/$BUILD_TYPE       && cd $BUILD_DIR/$BUILD_TYPE       && cmake         -DBINARY_DIR=$BINARY_DIR         -DSOURCE_DIR=$SOURCE_DIR         $SOURCE_DIR       && make $*

执行这个脚本,可以看到中间文件全部都在 wintemp 目录。还可以指定可执行文件的路径

    # 指定版本和项目名称
    cmake_minimum_required(VERSION 2.6)
    project(windows CXX)

    # 指定生成的执行文件路径
    set(EXECUTABLE_OUTPUT_PATH ${SOURCE_DIR}/bin)

    # 指定源码目录
    add_subdirectory(src)

如此一来,生成的执行文件就在源码目录下。

3.宏参数

多个项目存在共用代码的情况,举个最简单的例子,win98 和 win2000 共用 common/win.h 文件,这个文件里面定义了微软操作系统代号,比如 “win98”,”win2000”,很自然的可以想到用宏处理这个部分。

    #ifdef __WIN98__
    #define SYSNAME "win98"
    #endif

    #ifdef __WIN2000__
    #define SYSNAME "win2000"
    #endif

那么如何在项目中定义各自的编译参数呢?可以用 set_target_properties 这个方法。
在 win98 目录中的 CMakeLists.txt 中加上

    set_target_properties(win98 PROPERTIES COMPILE_DEFINITIONS "__WIN98__")

在 win2000 目录中的 CMakeLists.txt 中加上

    set_target_properties(win2000 PROPERTIES COMPILE_DEFINITIONS "__WIN2000__")

这样配置,win98 和 win2000 两个项目同时包含 common/win.h,可以得到不同的定义结果。

4.编译短小程序

程序员都会有一些目录,里面是自己写的短小代码,用以测试语法,函数用法等等。利用 cmake 可以很方便的编译这些细小的文件。

假设在 src 目录下存在 a.cc, b.cc, c.cc 等多个文件,每个文件都是一个独立的小程序,在 src 下建立的 CMakeLists.txt 中可以写一个脚本,将它们分别编程成对应的执行文件。

    aux_source_directory (. filelist)
    foreach(filename ${filelist})
      string( REGEX MATCH "([a-z_]+)" binname ${filename} )
      message( ${binname} )
      add_executable(${binname} ${filename})
    endforeach()

最后附上一个 CMakeLists.txt 的 例子,我从中收益良多。

时间: 2024-08-25 23:00:53

cmake新手入门教程的相关文章

【LaTeX】E喵的LaTeX新手入门教程(2)基础排版

换了块硬盘折腾了好久..联想的驱动真坑爹.前情回顾[LaTeX]E喵的LaTeX新手入门教程(1)准备篇文档框架嗯昨天我们已经编写了一个最基本的文档,其内容是这样的:\documentclass{article}\begin{document}XXX is a SB.\end{document}这个文档呢其实是分为两部分的:一部分是\begin{document}之前的那部分也就是第一行,这一部分我们称之为导言区.导言区的内容可以不只一行,它的作用是完成文档的基础设定.比如在这个文档中,我们使用

【LaTeX】E喵的LaTeX新手入门教程(5)参考文献、文档组织

这不是最后一篇,明天开始建模所以会从6号开始继续更新.前情回顾[LaTeX]E喵的LaTeX新手入门教程(1)准备篇 [LaTeX]E喵的LaTeX新手入门教程(2)基础排版 [LaTeX]E喵的LaTeX新手入门教程(3)数学公式 [LaTeX]E喵的LaTeX新手入门教程(4)图表参考文献天下文章一大抄,抄来抄去有提高. ——白岩松常备工具:JabRef>>戳我下载<<JabRef是一款管理参考文献用的软件,相当好用.装好了以后在选项中把这两个选项改成如图示的样子.*nix用户

【LaTeX】E喵的LaTeX新手入门教程(3)数学公式

昨天熄灯了真是坑爹.前情回顾[LaTeX]E喵的LaTeX新手入门教程(1)准备篇 [LaTeX]E喵的LaTeX新手入门教程(2)基础排版上一期测试答案1.大家一开始想到的肯定是\LaTeX{}er.其实\LaTeX er也可以的.2.\LaTeX{} er或\LaTeX\ er数学模式现在我们打算在文档中插入一些数学公式什么的了:按照正常的情况来说,数学公式里面的字符一般都是斜体,而我们要用\textit来一点点把需要变的文字变成斜体这显然是一件极其坑爹的事情.TeX的创造者高爷爷表示他搞T

【LaTeX】E喵的LaTeX新手入门教程(4)图表

这里说的不是用LaTeX画图,而是插入已经画好的图片..想看画图可以把滚动条拉到底.前情回顾[LaTeX]E喵的LaTeX新手入门教程(1)准备篇 [LaTeX]E喵的LaTeX新手入门教程(2)基础排版 [LaTeX]E喵的LaTeX新手入门教程(3)数学公式图片的插入A picture says more than a thousand words. — Shakespeare没图你说个××. ——莎士比亚LaTeX支持的图片格式由于在前面的教程中建议大家使用XeLaTeX,因此在图形格式的

【LaTeX】E喵的LaTeX新手入门教程(1)准备篇

昨天熄灯了真是坑爹.前情回顾[LaTeX]E喵的LaTeX新手入门教程(1)准备篇 [LaTeX]E喵的LaTeX新手入门教程(2)基础排版上一期测试答案1.大家一开始想到的肯定是\LaTeX{}er.其实\LaTeX er也可以的.2.\LaTeX{} er或\LaTeX\ er数学模式现在我们打算在文档中插入一些数学公式什么的了:按照正常的情况来说,数学公式里面的字符一般都是斜体,而我们要用\textit来一点点把需要变的文字变成斜体这显然是一件极其坑爹的事情.TeX的创造者高爷爷表示他搞T

CMake快速入门教程-实战

http://www.ibm.com/developerworks/cn/linux/l-cn-cmake/ http://blog.csdn.net/dbzhang800/article/details/6314073 http://www.cnblogs.com/coderfenghc/archive/2013/01/20/2846621.html http://blog.sina.com.cn/s/blog_4aa4593d0100q3bt.html http://hahack.com/c

【LaTeX】E喵的LaTeX新手入门教程(3)

[LaTeX]E喵的LaTeX新手入门教程(3) 数学公式作者: 郭英东.sty 昨天熄灯了真是坑爹.前情回顾 [LaTeX]E喵的LaTeX新手入门教程(1)准备篇 [LaTeX]E喵的LaTeX新手入门教程(2)基础排版 上一期测试答案1.大家一开始想到的肯定是\LaTeX{}er.其实\LaTeX er也可以的.2.\LaTeX{} er或\LaTeX\ er数学模式现在我们打算在文档中插入一些数学公式什么的了:按照正常的情况来说,数学公式里面的字符一般都是斜体,而我们要用\textit来

【LaTeX】E喵的LaTeX新手入门教程(6)中文

假期玩得有点凶 ._.前情回顾[LaTeX]E喵的LaTeX新手入门教程(1)准备篇 [LaTeX]E喵的LaTeX新手入门教程(2)基础排版 [LaTeX]E喵的LaTeX新手入门教程(3)数学公式 [LaTeX]E喵的LaTeX新手入门教程(4)图表 [LaTeX]E喵的LaTeX新手入门教程(5)参考文献.文档组织先扯一点没啥用的...话说呀在高老头发明TeX的时候..高老头是美国人嘛,自然是本着能用就好的原则,TeX只支持ASCII码.这一代算是第一代TeX程序.而中文编码都是多字节的,

MATLAB新手入门教程

MATLAB入门教程   1.MATLAB的基本知识 1-1.基本运算与函数    在MATLAB下进行基本数学运算,只需将运算式直接打入提示号(>>)之後,并按入Enter键即可.例如: >> (5*2+1.3-0.8)*10/25 ans =4.2000 MATLAB会将运算结果直接存入一变数ans,代表MATLAB运算後的答案(Answer)并显示其数值於萤幕上. 小提示: ">>"是MATLAB的提示符号(Prompt),但在PC中文视窗系统