【快速查询】https://cmake.org/cmake/help/v2.8.8/cmake.html#section_Commands

1 CMake简介

  CMake是跨平台编译工具,比make更高级一些。其编译的主要工作是生成CMakeLists.txt文件,然后根据该文件生成Makefile,最后调用make来生成可执行程序或者动态库。所以基本步骤就只有两步:(1)cmake生成CMakeLists.txt文件;(2)make执行编译工作。

  下面一张图对比一下AutoTools与CMake的工作流程(可见CMake比较清晰简洁):

2、CMakeLists.txt文件

详情参考:http://wiki.ros.org/catkin/CMakeLists.txt

  1. Required CMake Version (cmake_minimum_required)
  2. Package Name (project())
  3. Find other CMake/Catkin packages needed for build (find_package())
  4. Message/Service/Action Generators (add_message_files(), add_service_files(), add_action_files())
  5. Invoke message/service/action generation (generate_messages())
  6. Specify package build info export (catkin_package())
  7. Libraries/Executables to build (add_library()/add_executable()/target_link_libraries())
  8. Tests to build (catkin_add_gtest())
  9. Install rules (install())

(1)CMake Version: 
每一个 catkin CMakeLists.txt 必须以 CMake 需要的版本开始,Catkin 需要版本 2.8.3 或者更高

  1. cmake_minimum_required(VERSION 2.8.)

(2)Package name: 
CMake project function 指定的文件名。

  1. project(robot_brain)

在 CMake script 文件中,引用 CMake package 可以使用变量 ${PROJECT_NAME}

(3)依赖功能包:

寻找需要用到的其他 CMake packages,用函数 find_package。 
至少依赖一个关于 catkin 的功能包

  1. find_package(catkin REQUIRED)

如果要使用 C++ 和 Boost,则需要引用 find_package 包含 Boost,并且指明 Boost 的类型,如使用 Boost threads,则:

  1. find_package(Boost REQUIRED COMPONENTS thread)

(4)catkin_package()

catkin_package() 是 catkin 支持的 CMake 宏指令。用来向编译系统指明 catkin-specific 的信息,而编译系统来生成 pkg-config and CMake files。

该函数必须用在用 add_library() or add_executable() 声明之前。 
有5个可选参数:

  1. INCLUDE_DIRS - The exported include paths (i.e. cflags) for the package
  2. LIBRARIES - The exported libraries from the project
  3. CATKIN_DEPENDS - Other catkin projects that this project depends on
  4. DEPENDS - Non-catkin CMake projects that this project depends on
  5. CFG_EXTRAS - Additional configuration options

例如:

  1. catkin_package(
  2. INCLUDE_DIRS include
  3. LIBRARIES ${PROJECT_NAME}
  4. CATKIN_DEPENDS roscpp nodelet
  5. DEPENDS eigen opencv)

(5)Specifying Build Targets

3 一个简单的CMakeLists.txt入门示例

  外部编译:单独建立一个空目录专门用于cmake编译,便于管理编译中间文件。在空目录中用 cmake ../(CMakeLists.txt所在目录)就行了,中间文件生成在当前目录。

  工程结构:

  1. .
  2. ├── build
  3. ├── CMakeLists.txt
  4. ├── include
  5.    └── math_lib.h
  6. └── src
  7. ├── main.cpp
  8. └── math_lib.cpp
  9.  
  10. directories, files

  CMakeLists.txt示例(借鉴网友配置):

  1. # 1.cmake verson,指定cmake版本
  2. cmake_minimum_required(VERSION 3.4.1)
  3.  
  4. # 2.project name,指定项目的名称,一般和项目的文件夹名称对应
  5. PROJECT(test_math_lib)
  6.  
  7. # 3.head file path,头文件目录
  8. INCLUDE_DIRECTORIES(include)
  9.  
  10. # 4.source directory,源文件目录
  11. AUX_SOURCE_DIRECTORY(src DIR_SRCS)
  12.  
  13. # 5.set environment variable,设置环境变量,编译用到的源文件全部都要放到这里,否则编译能够通过,但是执行的时候会出现各种问题,比如"symbol lookup error xxxxx , undefined symbol"
  14. SET(TEST_MATH ${DIR_SRCS})
  15.  
  16. # 6.add executable file,添加要编译的可执行文件
  17. ADD_EXECUTABLE(${PROJECT_NAME} ${TEST_MATH})
  18.  
  19. # 7.add link library,添加可执行文件所需要的库,比如我们用到了libm.so(命名规则:lib+name+.so),就添加该库的名称
  20. TARGET_LINK_LIBRARIES(${PROJECT_NAME} m)

  编译方法(直接生成目标程序):

  1. kuliuheng@ubuntu:~/_8GB_EXT/workspace/cpp/testCmake$ cd build/
  2. kuliuheng@ubuntu:~/_8GB_EXT/workspace/cpp/testCmake/build$ cmake ../
  3. -- The C compiler identification is GNU 7.4.
  4. -- The CXX compiler identification is GNU 7.4.
  5. -- Check for working C compiler: /usr/bin/cc
  6. -- Check for working C compiler: /usr/bin/cc -- works
  7. -- Detecting C compiler ABI info
  8. -- Detecting C compiler ABI info - done
  9. -- Detecting C compile features
  10. -- Detecting C compile features - done
  11. -- Check for working CXX compiler: /usr/bin/c++
  12. -- Check for working CXX compiler: /usr/bin/c++ -- works
  13. -- Detecting CXX compiler ABI info
  14. -- Detecting CXX compiler ABI info - done
  15. -- Detecting CXX compile features
  16. -- Detecting CXX compile features - done
  17. -- Configuring done
  18. -- Generating done
  19. -- Build files have been written to: /home/kuliuheng/_8GB_EXT/workspace/cpp/testCmake/build

[CMAKE] 详解CMakeLists.txt文件的更多相关文章

  1. Cmake知识----编写CMakeLists.txt文件编译C/C++程序

    1.CMake编译原理 CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多.CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt ...

  2. Cmake知识----编写CMakeLists.txt文件编译C/C++程序(转)

    1.CMake编译原理 CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多.CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt ...

  3. Spring配置文件详解 – applicationContext.xml文件路径

    Spring配置文件详解 – applicationContext.xml文件路径 Java编程                 spring的配置文件applicationContext.xml的默 ...

  4. CMAKE 生成VS2008静态库工程 与 CMAKE使用,CMakeLists.txt编写总结

    cmake -G"Visual Studio 9 2008 Win64" 以上命令得用cd命令切换到顶层CMakeLists.txt的当前目录,才能生效 以下是CMakeLists ...

  5. Ros学习——Cmakelists.txt文件解读

    1.过程 .Required CMake Version (cmake_minimum_required) //CMake 需要的版本 .Package Name (project()) //#定义工 ...

  6. 简单CMakeLists.txt文件

    #CMakeLists.txt cmake_minimum_required(VERSION 2.8) project(server) #添加包含目录 include_directories(./in ...

  7. extern的使用详解(多文件编程)——C语言

    extern——关键字 extern是C语言中的一个关键字,一般用在变量名前或函数名前,作用是用来说明“此变量/函数是在别处定义的,要在此处引用”,extern这个关键字大部分读者应该是在变量的存储类 ...

  8. 用PHP实现浏览器点击下载各种格式文档的方法详解【txt apk等等】

    [[注:其他文件想设置成下载文件,和下面介绍的方法一致]] 由于现在的浏览器已经可以识别txt文档格式,如果只给txt文档做一个文字链接的话,点击后只是打开一个新窗口显示txt文件的内容,并不能实现点 ...

  9. ROS知识(8)----CMakeLists.txt文件编写的理解

    ROS(Indigo)编程必须要理解CMakeList.txt的编写规则,教程地址:catkin/CMakeLists.txt,官网有相关的教程,中文的翻译版本写的很不错,教程地址:ROS中的CMak ...

随机推荐

  1. python3.6升级

    Ubuntu 14.04 and 16.04 If you are using Ubuntu 14.04 or 16.04, you can use Felix Krull's deadsnakes ...

  2. 20165228 2017-2018-2 《Java程序设计》第5周学习总结

    20165228 2017-2018-2 <Java程序设计>第5周学习总结 教材学习内容总结 内部类和匿名类 通过throw关键字抛出异常对象,终止方法的继续执行 使用try-catch ...

  3. Android SO UPX壳问题小记

    网上有篇 Android SO(动态链接库)UPX加固指南,详细介绍了如何使用UPX给Android SO加壳,尝试做了一下结果ok,这里只记录遇到的几个小问题. 1.40k以下so不能加壳 kiii ...

  4. Python网络爬虫第二弹《http和https协议》

    一.HTTP协议 1.官方概念: HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文 ...

  5. jQuery.Deferred exception: $.get is not a function TypeError: $.get is not a function

    /********************************************************************** * jQuery.Deferred exception: ...

  6. [LeetCode&Python] Problem 387. First Unique Character in a String

    Given a string, find the first non-repeating character in it and return it's index. If it doesn't ex ...

  7. C语言--第七周作业评分(5班)

    作业链接:https://edu.cnblogs.com/campus/hljkj/CS2017-5/homework/1304 一.评分要求 要求1 完成PTA第七周所有题,总共两次题,每次12.5 ...

  8. C++学习(十六)(C语言部分)之 数组三

    复习 以及 测试 /* 一维数组 数组是相同的数据的一个集合 <类型><数组名>[下标表达式]={数组元素 初始值}; 数组名和变量的命名规则是一样的 数组名是一个地址 数组下 ...

  9. [原] Android上使用native IO

    首先, 官方google play对APK大小有限制: 50M.( https://support.google.com/googleplay/android-developer/answer/113 ...

  10. PHP用curl发送get post put delete patch请求

    function getUrl($url){ $headerArray = array("Content-type:application/json;", "Accept ...