C++开发者必备技能CMake

 先简单介绍一下,CMake是一个跨平台的编译工具,它可以根据不用的平台,不同的编译环境,生成不同的MakeFile,从而控制编译的过程。
使用CMake的步骤:
1、ccmake directory     //配置编译选项,这个命令不太常用,所以没有深入了解
 
2、cmake directory      //这个目录是CMkaeLists.txt所在的目录,用于生成MakeFile文件,实际使用首先要执行这个命令生成MakeFile,才能进行下一步编译工作,这一步cmake会查询当前的编译环境,生成适合当前环境的编译文件
3、make                       //最后一步,简单的make,不需要参数,自动完成编译,执行这个命令需要在MakeFile目录下
 
使用cmake的命令就是这么简单,但是最复杂的在于CMakeLists.txt的编写,它包含一系列编译的命令,包括定义工程信息,包含头文件,链接库文件等等,使用cmake最关键的就是学会CMkaeLists.txt的命令。(CMakeLists.txt对命令大小写不敏感)
 
如果工程下面有子目录,子目录下需要定义一些库的话,可以把所有的文件在工程的根目录的CMakeLists.txt中全部指定,但是这样做在工程庞大的情况下根目录的CMakeLists.txt会显得非常臃肿且难以管理,所以我们可以在每个子目录中都使用一个CMakeLists.txt,然后对每一个子目录中的库进行单独的编译。因此常用的做法是专门写一个编译的脚本,按照库引用的先后顺序去编译每一个子目录下面的库
 
project(test)   project定义一个工程,名字为test
 
add_library(lib_sock sock.cpp sock.h)     add_library命令,添加一个库,这个库要编译的文件列表,第一个lib_sock是给这个库定义一个名称,sock.cpp sock.h是这个库要编译的文件,例如添加一个sock类,类声明放在sock.h中,函数实现放在sock.cpp中,那么如果后面编译库文件或者编译可执行文件要用到这个类的话,必须以这样的形式把这两个文件包含进来。
 
link_libraries(lib_sock)    链接库命令,上面add_library定义了一个库,名字为lib_sock,link_libraries命令就是把这个库编译好后链接进来,这个步骤是必须的
 
add_executable(pop3_client client.cpp)    编译一个可执行文件,如果client.cpp中用到了上面的sock.h中的类,那么在执行这个命令之前必须执行add_library和link_libraries命令先把库链接进来才能编译出这个可执行文件
 
FIND_LIBRARY(SUM_LIB lib_sum ./sum NO_DEFAULT_PATH)     FIND_LIBRARY命令,用于在不确定库的位置的时候模糊查找的命令,在例子中./sum是要查找的目录的路径,可以是相对路径,lib_sum是要查找的库的名称,SUM_LIB将会得到查找的结果,所以这条命令往往要配合link_libraries命令使用,也就是在查找到库之后如果下一步的编译需要用到,那么就把这个库链接进来。因此这里也可以看出link_libraries命令的参数其实就是一个库的路径,例如我们也可以这样去调用这个命令: link_libraries(/home/xiaxiaosheng/test/sum/liblib_sum.a),liblib_sum.a是一个已经编译好的静态库
 
下面这个例子是我练习的时候的CMakeLists.txt:
project(pop3_client)

add_library(
lib_sock
sock.cpp
sock.h
)
link_libraries(lib_sock) link_libraries(${PROJECT_SOURCE_DIR}/sum/liblib_sum.a)
#FIND_LIBRARY(SUM_LIB lib_sum ./sum NO_DEFAULT_PATH) #message("sum_lib:::======================" ${SUM_LIB}) #打印一条信息 #link_libraries(${SUM_LIB}) #把找到的库链接 add_executable(pop3_client client.cpp) #编译出一个可执行文件

其中这个PROJECT_SOURCE_DIR是工程的根目录,用的时候像shell脚本的语法类似${PROJECT_SOURCE_DIR},要注意的地方就是link_libraries的参数是一个库的路径,但是,这个路径只能是绝对路径,不能是相对目录,所以我们这个时候就可以用${PROJECT_SOURCE_DIR}工程的根目录,从根目录出发,在后面加上相对于根目录的路径就可以得到目标的绝对路径,例如${PROJECT_SOURCE_DIR}/sum/liblib_sum.a,这个liblib_sum.a就是根目录下的一个子目录sum下有一个liblib_sum.a库

 
 
持续更新...
                             

CMake学习笔记的更多相关文章

  1. cmake学习笔记(五)

    在cmake 学习笔记(三) 中简单学习了 find_package 的 model 模式,在cmake 学习笔记(四)中了解一个CMakeCache相关的东西.但靠这些知识还是不能看懂PySide使 ...

  2. cmake 学习笔记(三)

    转自:http://blog.csdn.net/dbzhang800/article/details/6329314 接前面的 Cmake学习笔记(一) 与 Cmake学习笔记(二) 继续学习 cma ...

  3. cmake 学习笔记(二)

    在 Cmake学习笔记一 中通过一串小例子简单学习了cmake 的使用方式. 这次应该简单看看语法和常用的命令了. 简单的语法 注释 # 我是注释 命令语法 COMMAND(参数1 参数2 ...) ...

  4. cmake 学习笔记(三) (转)

    接前面的 Cmake学习笔记(一) 与 Cmake学习笔记(二) 继续学习 cmake 的使用. 学习一下cmake的 finder. finder是神马东西? 当编译一个需要使用第三方库的软件时,我 ...

  5. CMake学习笔记四:usb_cam的CMakeLists解析

    最近在学习cmake,在完整看了<cmake实践>一书后,跟着书上例程敲了跑了一遍,也写了几篇相关读书笔记,算是勉强基本入门了.所以找了usb_cam软件包的CMakeLists.txt来 ...

  6. cmake 学习笔记(六)

    希望这是现阶段阻碍阅读shiboken和PySide源码的涉及cmake的最后一个障碍 ^ _^ 学习 cmake 的单元测试部分 ctest. 简单使用 最简单的使用ctest的方法,就是在 CMa ...

  7. cmake 学习笔记(四)

    接前面的一二三,学习一下 CMakeCache.txt 相关的东西. CMakeCache.txt 可以将其想象成一个配置文件(在Unix环境下,我们可以认为它等价于传递给configure的参数). ...

  8. cmake 学习笔记(一)

    最大的Qt4程序群(KDE4)采用cmake作为构建系统 Qt4的python绑定(pyside)采用了cmake作为构建系统 开源的图像处理库 opencv 采用cmake 作为构建系统 ... 看 ...

  9. cmake学习笔记之add_library、target_link_libraries和link_directories

    cmake是Linux(这里默认是Ubuntu系统)下常使用的编译C++的工具,而使用cmake就需要先在CmakeLists.txt文件中对编译规则进行.这里介绍常用的三种指令add_library ...

随机推荐

  1. Spring 下默认事务机制中@Transactional 无效的原因

    Spring中 @Transactional 注解的限制1. 同一个类中, 一个nan-transactional的方法去调用transactional的方法, 事务会失效 If you use (d ...

  2. [LeetCode] Min Stack 最小栈

    Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. pu ...

  3. 一个简单oop的changeTab

    好多地方都会用到这样一个效果“点击tab切换内容页”,根据自己的想法实现了一下,写了个简单的插件.以前写代码都是标准的函数式编程,现在觉得面向对象编程看起来比较爽,并且更容易维护,于是就用oop的思想 ...

  4. Jenkins创建Maven项目及SSH部署

    前面我们已经安装了Jenkins的环境,以及配置好了jdk和maven.下面我们来看如何通过Jenkins将svn的项目进行打包和部署. 创建MAVEN项目 1.点击新建,输入项目名,选择" ...

  5. C语言猜数字游戏

    猜数字游戏,各式各样的实现方式,我这边提供一个实现方式,希望可以帮到新手. 老程序猿就不要看了,黑呵呵 源代码1 include stdio.h include stdlib.h include ti ...

  6. PHP 扩展开发(将自己的一些代码封装成PHP扩展函数)

    今天时间不多,先给个地址,能搜到我这篇blog的朋友先看看我最近在看的一些文章.资料吧: 我的环境是 lnmp1.1 的 (LNMP一键安装包),所以要进行PHP扩展开发首先应该对环境配置和shell ...

  7. <form:select>的使用

    最近在学习springMVC,用到了<form:select>标签,使用发过程中遇到了些问题,现在记录下,以防忘记. 我jsp页面是这样的: <%@ page language=&q ...

  8. C#计算一段程序运行时间的三种方法

    第一种方法利用System.DateTime.Now: static void SubTest() { DateTime beforDT = System.DateTime.Now; //耗时巨大的代 ...

  9. supervisor的使用:

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #e4af0a } sp ...

  10. 翻书插件:wowbook.js

    wowbook是一个jQuery插件,可以让你在网站中发布一本页面翻转效果超赞的书. demo演示 基本页面 <!DOCTYPE html> <html lang="en& ...