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. win10+vs2013+cuda8.0+caffe

    1,首先说下环境和配置 配置: 环境:windows10,vs2013 community,cuda8.0,caffe,cudnn4 注意:先要安装好显卡驱动(我的显卡是1070),这里的例子只开通了 ...

  2. [LeetCode] Longest Substring Without Repeating Characters 最长无重复子串

    Given a string, find the length of the longest substring without repeating characters. For example, ...

  3. cosbench 压测RGW生产环境

    配置信息: 使用  2个万兆网卡的RGW主机,并用OSPF做高可用和负载均衡.  Ceph OSD集群 有21Node (万兆网卡+ 12个4T SATA机械硬盘) 测试VM配置: 使用在使用VXLA ...

  4. 提高前端开发效率必备AngularJS (基础)

    简介 AngularJS 是一个为动态WEB应用设计的结构框架,提供给大家一种新的开发应用方式,这种方式可以让你扩展HTML的语法,以弥补在构建动态WEB应用时静态文本的不足,从而在web应用程序中使 ...

  5. 【BZOJ 3445】【Usaco2014 Feb】Roadblock

    http://www.lydsy.com/JudgeOnline/problem.php?id=3445 加倍的边一定在最短路上(否则继续走最短路). 最短路长度是O(n)的,暴力扫最短路上的每条边, ...

  6. PL/SQL数据库,Oracle登录

    用户名:TESTZYPX_9999 数据库:10.75.142.242:1521/orcl

  7. NSRunLoop

    1.什么是RunLoop 运行循环 一个线程对应一个RunLoop,主线程的RunLoop默认已经启动,子线程的RunLoop得手动启动(调用run方法) RunLoop只能选择一个Mode启动,如果 ...

  8. Django进阶(一)

    Url进阶 mysit/mysit/urls.py from django.conf.urls import url from django.contrib import admin urlpatte ...

  9. hdu 4859 海岸线 Bestcoder Round 1

    http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...

  10. Bzoj1269 [AHOI2006]文本编辑器editor

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3678  Solved: 1380 Description 这些日子,可可不和卡卡一起玩了,原来可可正 ...