Linux编程 - CMake使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Osean_li/article/details/85253339

引言

在Linux下编程的时候,CMake是常使用到的工具。
CMake多用于一些开源的项目中,相传阿里使用CMake颇多。我呢?大多数都是使用VS 进行开发的,对于CMake使用很少。借此机会,系统的学习下CMake。

引入

在学习CMake 之前我们先看看编译的整体过程,更有利于CMake的工作流程
编译的四个阶段

  • 预处理:编译处理宏定义等宏命令(eg:#define)——生成后缀为“.i”的文件
  • 编译:将预处理后的文件转换成汇编语言——生成后缀为“.s”的文件
  • 汇编:由汇编生成的文件翻译为二进制目标文件——生成后缀为“.o”的文件
  • 连接:多个目标文件(二进制)结合库函数等综合成的能直接独立执行的执行文件——生成后缀为“.out”的文件

CMake

CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多。CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库(so(shared object))。因此CMake的编译基本就两个步骤:

1. cmake
2. make

cmake 指向CMakeLists.txt所在的目录,例如cmake … 表示CMakeLists.txt在当前目录的上一级目录。cmake后会生成很多编译的中间文件以及makefile文件,所以一般建议新建一个新的目录,专门用来编译,例如

mkdir build
cd build
cmake ..
make

CMake实例

脚本文件

整个过程就是,新建立build文件夹(存放编译的中间文件)
执行 cmake 生成makefile文件 然后 执行make clean 清理 随后执行make

下面就看看CMake都做了什么

CMakeLists.txt

在CMakeLists.txt中简单配置,就可以完成很多复杂的功能,包括写测试用例。如果有嵌套目录,子目录下可以有自己的CMakeLists.txt。总之很强大!

命令

project (HELLO) #指定项目名称,生成的VC项目的名称;

使用${HELLO_SOURCE_DIR}表示项目根目录

include_directories:指定头文件的搜索路径,相当于指定gcc的-I参数
include_directories (${HELLO_SOURCE_DIR}/Hello) #增加Hello为include目录

link_directories:动态链接库或静态链接库的搜索路径,相当于gcc的-L参数
link_directories (${HELLO_BINARY_DIR}/Hello) #增加Hello为link目录

add_subdirectory:包含子目录
add_subdirectory (Hello)

add_executable:编译可执行程序,指定编译,好像也可以添加.o文件
add_executable (helloDemo demo.cxx demo_b.cxx) #将cxx编译成可执行文件——

add_definitions:添加编译参数
add_definitions(-DDEBUG)将在gcc命令行添加DEBUG宏定义;
add_definitions( “-Wall -ansi –pedantic –g”)

target_link_libraries:添加链接库,相同于指定-l参数
target_link_libraries(demo Hello) #将可执行文件与Hello连接成最终文件demo

add_library:
add_library(Hello hello.cxx) #将hello.cxx编译成静态库如libHello.a

add_custom_target:

message( status|fatal_error, “message”):

set_target_properties( … ): lots of properties… OUTPUT_NAME, VERSION, …

link_libraries( lib1 lib2 …): All targets link with the same set of libs

CMakeLists.txt分析

CMakeLists.txt

  • cmake_minimum_required 要求CMake的最低版本为2.6
  • add_definitions 以通过add_definitions命令添加编译选项。由-D定义的标志。定义GLIBCXX_USE_CXX11_ABI=0
  • include_directories 指定头文件的搜索路径,相当于指定gcc编译器的-I参数
  • link_directories 动态链接库或静态链接库的搜索路径,相当于指定gcc的-L参数
  • add_executable 编译可执行程序
  • target_link_libraries 指定链接库,相同于指定-l参数
  • SET 在CMakeLists.txt中指定,使用set

猜你喜欢

转载自blog.csdn.net/Osean_li/article/details/85253339