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. PHP的GD库

    GD库 PHP通过GD库,可以对JPG.PNG.GIF.SWF等图片进行处理.GD库常用在图片加水印,验证码生成等方面. 绘制线条 要对图形进行操作,首先要新建一个画布,通过imagecreatetr ...

  2. Nginx深入详解之多进程网络模型

    一.进程模型        Nginx之所以为广大码农喜爱,除了其高性能外,还有其优雅的系统架构.与Memcached的经典多线程模型相比,Nginx是经典的多进程模型.Nginx启动后以daemon ...

  3. Linux下更换默认yum源为网易yum源的操作记录

    废话不多说,下面记录了centos下更换系统默认yum源为网易yum源的操作过程:1)备份原有的默认yum源[root@bastion-IDC ~]# cp /etc/yum.repos.d/Cent ...

  4. [LeetCode] Range Sum Query - Immutable 区域和检索 - 不可变

    Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive ...

  5. [LeetCode] Insert Interval 插入区间

    Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...

  6. tomcat启动报错: org.apache.catalina.deploy.WebXml addFilter

    解决方法为:在Tomacat7的context.xml文件里的<Context>中加上<Loader delegate="true" />

  7. 移动端重要的几个CSS3属性设置

    去掉点击链接和文本框对象的半透明覆盖(iOS)或者虚框(Android) -webkit-tap-hightlight-color:rgba(0,0,0,0); 禁用长按页面时弹出菜单(iOS下有效) ...

  8. iOS 读取大文件时候的注意点

    转: 使用NSData读取数据,采用NSData的dataWithContentsOfFile:方法.不少人反馈说如果直接使用,将会耗尽iOS的内存. 其实这个是可以改善的. NSData还有一个AP ...

  9. JS倒计时执行操作

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. React.js 官网入门教程 分离文件 操作无法正常显示HelloWord

    对着React官网的教程练习操作,在做到分离文件练习时,按照官网步骤来却怎么也无法正常显示HelloWord. 经测试,html文件中内容改为: <!DOCTYPE html><ht ...