[CMAKE] 详解CMakeLists.txt文件
【快速查询】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
- 、Required CMake Version (cmake_minimum_required)
- 、Package Name (project())
- 、Find other CMake/Catkin packages needed for build (find_package())
- 、Message/Service/Action Generators (add_message_files(), add_service_files(), add_action_files())
- 、Invoke message/service/action generation (generate_messages())
- 、Specify package build info export (catkin_package())
- 、Libraries/Executables to build (add_library()/add_executable()/target_link_libraries())
- 、Tests to build (catkin_add_gtest())
- 、Install rules (install())
(1)CMake Version:
每一个 catkin CMakeLists.txt 必须以 CMake 需要的版本开始,Catkin 需要版本 2.8.3 或者更高
- cmake_minimum_required(VERSION 2.8.)
(2)Package name:
CMake project function 指定的文件名。
- project(robot_brain)
在 CMake script 文件中,引用 CMake package 可以使用变量 ${PROJECT_NAME}
(3)依赖功能包:
寻找需要用到的其他 CMake packages,用函数 find_package。
至少依赖一个关于 catkin 的功能包
- find_package(catkin REQUIRED)
如果要使用 C++ 和 Boost,则需要引用 find_package 包含 Boost,并且指明 Boost 的类型,如使用 Boost threads,则:
- 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个可选参数:
- INCLUDE_DIRS - The exported include paths (i.e. cflags) for the package
- LIBRARIES - The exported libraries from the project
- CATKIN_DEPENDS - Other catkin projects that this project depends on
- DEPENDS - Non-catkin CMake projects that this project depends on
- CFG_EXTRAS - Additional configuration options
例如:
- catkin_package(
- INCLUDE_DIRS include
- LIBRARIES ${PROJECT_NAME}
- CATKIN_DEPENDS roscpp nodelet
- DEPENDS eigen opencv)
(5)Specifying Build Targets
3 一个简单的CMakeLists.txt入门示例
外部编译:单独建立一个空目录专门用于cmake编译,便于管理编译中间文件。在空目录中用 cmake ../(CMakeLists.txt所在目录)就行了,中间文件生成在当前目录。
工程结构:
- .
- ├── build
- ├── CMakeLists.txt
- ├── include
- │ └── math_lib.h
- └── src
- ├── main.cpp
- └── math_lib.cpp
- directories, files
CMakeLists.txt示例(借鉴网友配置):
- # 1.cmake verson,指定cmake版本
- cmake_minimum_required(VERSION 3.4.1)
- # 2.project name,指定项目的名称,一般和项目的文件夹名称对应
- PROJECT(test_math_lib)
- # 3.head file path,头文件目录
- INCLUDE_DIRECTORIES(include)
- # 4.source directory,源文件目录
- AUX_SOURCE_DIRECTORY(src DIR_SRCS)
- # 5.set environment variable,设置环境变量,编译用到的源文件全部都要放到这里,否则编译能够通过,但是执行的时候会出现各种问题,比如"symbol lookup error xxxxx , undefined symbol"
- SET(TEST_MATH ${DIR_SRCS})
- # 6.add executable file,添加要编译的可执行文件
- ADD_EXECUTABLE(${PROJECT_NAME} ${TEST_MATH})
- # 7.add link library,添加可执行文件所需要的库,比如我们用到了libm.so(命名规则:lib+name+.so),就添加该库的名称
- TARGET_LINK_LIBRARIES(${PROJECT_NAME} m)
编译方法(直接生成目标程序):
- kuliuheng@ubuntu:~/_8GB_EXT/workspace/cpp/testCmake$ cd build/
- kuliuheng@ubuntu:~/_8GB_EXT/workspace/cpp/testCmake/build$ cmake ../
- -- The C compiler identification is GNU 7.4.
- -- The CXX compiler identification is GNU 7.4.
- -- Check for working C compiler: /usr/bin/cc
- -- Check for working C compiler: /usr/bin/cc -- works
- -- Detecting C compiler ABI info
- -- Detecting C compiler ABI info - done
- -- Detecting C compile features
- -- Detecting C compile features - done
- -- Check for working CXX compiler: /usr/bin/c++
- -- Check for working CXX compiler: /usr/bin/c++ -- works
- -- Detecting CXX compiler ABI info
- -- Detecting CXX compiler ABI info - done
- -- Detecting CXX compile features
- -- Detecting CXX compile features - done
- -- Configuring done
- -- Generating done
- -- Build files have been written to: /home/kuliuheng/_8GB_EXT/workspace/cpp/testCmake/build
[CMAKE] 详解CMakeLists.txt文件的更多相关文章
- Cmake知识----编写CMakeLists.txt文件编译C/C++程序
1.CMake编译原理 CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多.CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt ...
- Cmake知识----编写CMakeLists.txt文件编译C/C++程序(转)
1.CMake编译原理 CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多.CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt ...
- Spring配置文件详解 – applicationContext.xml文件路径
Spring配置文件详解 – applicationContext.xml文件路径 Java编程 spring的配置文件applicationContext.xml的默 ...
- CMAKE 生成VS2008静态库工程 与 CMAKE使用,CMakeLists.txt编写总结
cmake -G"Visual Studio 9 2008 Win64" 以上命令得用cd命令切换到顶层CMakeLists.txt的当前目录,才能生效 以下是CMakeLists ...
- Ros学习——Cmakelists.txt文件解读
1.过程 .Required CMake Version (cmake_minimum_required) //CMake 需要的版本 .Package Name (project()) //#定义工 ...
- 简单CMakeLists.txt文件
#CMakeLists.txt cmake_minimum_required(VERSION 2.8) project(server) #添加包含目录 include_directories(./in ...
- extern的使用详解(多文件编程)——C语言
extern——关键字 extern是C语言中的一个关键字,一般用在变量名前或函数名前,作用是用来说明“此变量/函数是在别处定义的,要在此处引用”,extern这个关键字大部分读者应该是在变量的存储类 ...
- 用PHP实现浏览器点击下载各种格式文档的方法详解【txt apk等等】
[[注:其他文件想设置成下载文件,和下面介绍的方法一致]] 由于现在的浏览器已经可以识别txt文档格式,如果只给txt文档做一个文字链接的话,点击后只是打开一个新窗口显示txt文件的内容,并不能实现点 ...
- ROS知识(8)----CMakeLists.txt文件编写的理解
ROS(Indigo)编程必须要理解CMakeList.txt的编写规则,教程地址:catkin/CMakeLists.txt,官网有相关的教程,中文的翻译版本写的很不错,教程地址:ROS中的CMak ...
随机推荐
- 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 ...
- 20165228 2017-2018-2 《Java程序设计》第5周学习总结
20165228 2017-2018-2 <Java程序设计>第5周学习总结 教材学习内容总结 内部类和匿名类 通过throw关键字抛出异常对象,终止方法的继续执行 使用try-catch ...
- Android SO UPX壳问题小记
网上有篇 Android SO(动态链接库)UPX加固指南,详细介绍了如何使用UPX给Android SO加壳,尝试做了一下结果ok,这里只记录遇到的几个小问题. 1.40k以下so不能加壳 kiii ...
- Python网络爬虫第二弹《http和https协议》
一.HTTP协议 1.官方概念: HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文 ...
- jQuery.Deferred exception: $.get is not a function TypeError: $.get is not a function
/********************************************************************** * jQuery.Deferred exception: ...
- [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 ...
- C语言--第七周作业评分(5班)
作业链接:https://edu.cnblogs.com/campus/hljkj/CS2017-5/homework/1304 一.评分要求 要求1 完成PTA第七周所有题,总共两次题,每次12.5 ...
- C++学习(十六)(C语言部分)之 数组三
复习 以及 测试 /* 一维数组 数组是相同的数据的一个集合 <类型><数组名>[下标表达式]={数组元素 初始值}; 数组名和变量的命名规则是一样的 数组名是一个地址 数组下 ...
- [原] Android上使用native IO
首先, 官方google play对APK大小有限制: 50M.( https://support.google.com/googleplay/android-developer/answer/113 ...
- PHP用curl发送get post put delete patch请求
function getUrl($url){ $headerArray = array("Content-type:application/json;", "Accept ...