vlambda博客
学习文章列表

学了C语言居然还不会用CMake???

    学过C语言之后,已经过了老长一段时间。女朋友在使用Clion以及别的操作系统命令行的时候,总是会用到gcc这个工具。但是,简单的单文件编译难以满足正常的需求,没错,又投来疑惑的目光。

        咳咳。。。




        CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。在安装CMake环境的时候,可以选择类似MinGW(Windows端)平台。具体的安装过程不在赘述。




简单入门

1.首先编写 CMakeLists.txt 文件,并保存在与 main.c 源文件同个目录下:

# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)

#
项目信息,项目名称
project (Demo1)

#
指定生成目标,将名为 main.c 的源文件编译成一个名称为 Demo 的可执行文件
add_executable(Demo main.c)

2.之后,在当前目录执行 cmake . ,得到 Makefile 后再使用make 命令编译得到 Demo1 可执行文件

  1. 使用./Demo运行所得程序

单目录,多文件

# 目录结构
./Demo2
|
+--- main.cc
|
+--- MathFunctions.c
|
+--- MathFunctions.h

1.改写CMakeLists.txt

# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)

# 项目信息
project (Demo2)

# 指定生成目标
add_executable(Demo main.c MathFunctions.c)
  • 当文件中引用过多的外部文件,使用aux_source_directory(<dir> <variable>)将该目录下的文件都赋值到变量中,改写如下

# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)

# 项目信息
project (Demo2)

# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)

# 指定生成目标
add_executable(Demo ${DIR_SRCS})

多目录,多文件

# 目录结构
./Demo3
|
+--- main.c
|
+--- math/
|
+--- MathFunctions.c
|
+--- MathFunctions.h
  1. 分别在项目根目录 Demo3 和 math 目录里各编写一个 CMakeLists.txt 文件

  • 使用命令add_subdirectory指明本项目包含一个子目录 math

  • 使用命令target_link_libraries指明可执行文件 main 需要连接一个名为MathFunctions的链接库 。

# 根目录
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)

# 项目信息
project (Demo3)

# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)

# 添加 math 子目录
add_subdirectory(math)

# 指定生成目标
add_executable(Demo main.c)

# 添加链接库
target_link_libraries(Demo MathFunctions)
  • 使用命令add_library将src目录中的源文件编译为静态链接库

# 子目录
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_LIB_SRCS 变量
aux_source_directory(. DIR_LIB_SRCS)

# 生成链接库
add_library (MathFunctions ${DIR_LIB_SRCS})

CMake下使用gdb调试代码

  1. 在CMakeLists.txt中加入

SET(CMAKE_BUILD_TYPE "Debug")  
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
  1. 使用CMake重新编译cmake -DCMAKE_BUILD_TYPE=Debug Path

  2. 在进入工程中,执行make,最后gdb Demo进行代码调试



    以上便是使用CMake的基本操作,当然,CMake还支持使用动态库编译等方式来搭建环境,有需要的话再加以阐述。


    果然还是CMake大法好。。。