`
aigo
  • 浏览: 2648826 次
  • 性别: Icon_minigender_1
  • 来自: 宜昌
社区版块
存档分类
最新评论

CMake 教程

阅读更多

官方快速上手教程:https://cmake.org/cmake-tutorial/

 

转自:http://xiang.lf.blog.163.com/blog/static/127733322201481114456136/

 

CMake是一个跨平台的程序构建工具,比如起自己编写Makefile方便很多。

介绍:http://baike.baidu.com/view/1126160.htm

本文件不介绍CMake的基本语法,下面是篇不错的入门教程:

http://www.ibm.com/developerworks/cn/linux/l-cn-cmake/

 

一,首先构建比较简单的工程,来对CMake有个简单的了解

1.构建一个工程的时候,需要做的几件事情(如果下面几件事你知道怎么做了,多大的工程就都不是问题了):

A.源代码在哪里?

B.头文件在哪里?

C.怎么生成静态或者动态库?

D.程序链接的静态库在哪里?

E.如果工程的代码存放在很多地方,那又该怎么找到它们呢?

 

2.下面从一个最简单的HelloWorld开始,然后一步一步构建一个比较复杂的工程:

A.工程文件如下(只有一个helloworld.cpp源文件):

ciw@ubuntu:~/my_projects/test$ tree .
└── helloworld.cpp

 

B.这时候,我们要写一个CMakeLists.txt(就3句代码):

PROJECT(hello)                                             #定义整个CMake的工程名
FILE(GLOB SOURCE "./*.cpp")                      #告诉CMake:工程的源文件在哪里?
ADD_EXECUTABLE(hello ${SOURCE})         #告诉CMake:我们要生成可执行文件(hello),并且源文件是由上面定义的

这样就可以在目录下生成一个hello可执行文件了。

 

3.下面,我们讲一个带头文件的,而且文件都是存放在不同地方:

A.代码分布如下(main.cpp是main函数,里面调用了hello.h声明的SayHello,定义在hello.cpp中):

ciw@ubuntu:~/my_projects/test$ tree .
├── CMakeLists.txt
├── hello
│   └── hello.cpp
├── include
│   └── hello.h
└── main
    └── main.cpp

B.main的代码:

  #include "hello.h“
  int main()
   {
       SayHello();
       return 0;
   }

C.CMakeLists.txt:

1 PROJECT(hello_2)

3 FILE(GLOB SOURCE_1 "${CMAKE_SOURCE_DIR}/main/*.cpp") //下面2句告诉CMake,源文件在哪里?main.cpp
4 FILE(GLOB SOURCE_2 "${CMAKE_SOURCE_DIR}/hello/*.cpp")//程序必须链接到hello.cpp里面的SayHello

6 INCLUDE_DIRECTORIES("${CMAKE_SOURCE_DIR}/include/")//告诉CMake头文件在哪里?

8 ADD_EXECUTABLE(hello_2 ${SOURCE_1} ${SOURCE_2})

 

4.最后来一个复杂的工程:

A.工程描述:

该工程由一个静态库和一个可执行文件组成,头文件和源文件都不在同一个目录,并且CMake也是独立在一个目录

 

B.代码分布:

ciw@ubuntu:~/my_projects/test$ tree .
test                                                         //工程根目录
├── cmake                                           //CMake目录:代码和CMake编译目录分离
│   ├── bin
│   │   └── main                                  //生成后的可执行文件
│   ├── CMakeLists.txt
│   ├── lib
│   │   └── libhello.a                          //生成后的静态库
│   └── src
│       ├── CMakeLists.txt
│       ├── hello
│       │   └── CMakeLists.txt
│       └── main
│           └── CMakeLists.txt
├── hello                                              //hello静态库的源代码
│   └── hello.cpp
├── include                                          //头文件
│   └── hello.h
└── main                                              //可执行文件的源代码目录
    └── main.cpp
可以看出,CMake里面的每一个子目录都有一个CMakeLists.txt

C.编译该工程的过程:

(a).首先,需要给CMake的一个总入口,这个CMake设置一些全局的变量(cmake/CMakeLists.txt):

PROJECT(hello_3)

SET(PROJECT_ROOT_PATH "${CMAKE_SOURCE_DIR}/../")                 #工程的根目录,即test
SET(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin/")    #可执行生成后存放的目录(CMAKE_SOURCE_DIR是cmake目录)
SET(LIBRARY_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/lib/")             #静态库生成后存放的目录

INCLUDE_DIRECTORIES("${PROJECT_ROOT_PATH}/include/")            #告诉CMake头文件在哪里?

LINK_DIRECTORIES("${CMAKE_SOURCE_DIR}/lib/")                             #告诉CMake静态库在哪里?

ADD_SUBDIRECTORY(src)                                                                     #多目录,把src目录加进来,src里面才是真正编译main和hello的

(b).src目录下的CMakeList.txt,这个CMake只是简单地把main目录和hello目录链接起来:

ADD_SUBDIRECTORY(main)
ADD_SUBDIRECTORY(hello)

(c).hello静态库:

FILE(GLOB SOURCE_1 "${PROJECT_ROOT_PATH}/hello/*.cpp")      #告诉CMake源文件在哪里?
ADD_LIBRARY(hello STATIC ${SOURCE_1})                                       #告诉CMake生成的是一个静态库

 

(d).main可执行文件:

FILE(GLOB SOURCE_1 "${PROJECT_ROOT_PATH}/main/*.cpp")     #告诉CMake源文件在哪里?

ADD_EXECUTABLE(main ${SOURCE_1})                                          #告诉CMake生成一个main可执行文件
TARGET_LINK_LIBRARIES(main hello)                                              #告诉CMake静态库在哪里?

 

整个编译的过程就是这样了,最主要的是记住上面”构建一个工程的时候,需要做的几件事情:头文件,源文件,静态库这个元素“,那么再复杂的工程都是这样一步一步构建的

分享到:
评论

相关推荐

    Cmake 教程

    CMake 是一个跨平台的构建系统,用于...通过阅读提供的 "cmake教程.pdf" 和 "CMake Practice.pdf",你可以深入了解这些概念,并通过实践进一步巩固你的 CMake 技能。学习 CMake 能让你的跨平台开发变得更加高效和简单。

    cmake教程.rar

    这个"cmake教程.rar"压缩包很可能是为了帮助用户理解和掌握CMake的使用方法,包括设置项目、编译配置、生成构建文件等核心概念。 CMake的基本工作原理是通过读取一系列名为"CMakeLists.txt"的文本文件,这些文件...

    cmake教程.pdf

    这个“cmake教程”将引导我们深入了解CMake的工作原理和使用方法。 CMake的基本理念是通过一个高层次的、平台无关的描述语言(即CMakeLists.txt文件)来定义构建过程,然后生成特定平台的构建工具所需的项目文件,...

    CMake教程.zip

    总的来说,CMake教程将带你逐步掌握配置项目、管理依赖、跨平台构建、测试和部署等各个环节,让你在Linux和Windows环境下编写软件变得更加高效和便捷。通过深入学习和实践,你将能够熟练运用CMake解决实际开发中的...

    超详细的cmake教程(去糟粕-重实践-学以致用).pdf

    标题:“超详细的cmake教程(去糟粕-重实践-学以致用).pdf” 描述:“以通俗化的语言,深入浅出的介绍了程序构建原理以及cmake的编写方法,使我们能知其然并知其所以然。摒弃长篇大论的一贯作风,去除糟粕,提炼精髓...

    cmake教程 cmake教程 cmake教程

    【CMake教程】CMake是一种跨平台的构建系统,用于管理软件项目的编译过程。它由Kitware公司和开源社区共同开发,最初是为了支持VTK等工具套件的构建而诞生,现在已经成为一个独立且广泛使用的开源项目。CMake的设计...

    cmake教程+源码.rar

    CMake教程结合源码的学习方式,为开发者提供了直观和实践性的学习体验。通过这个教程,你可以掌握如何使用CMake管理项目,设置构建环境,处理依赖,以及实现跨平台的构建。对于C++开发者来说,尤其是那些需要在多种...

    CMake教程及实战

    在"CMake教程"中,你将了解到CMake的基本概念和核心组件,例如`CMakeLists.txt`文件,它是每个CMake项目的入口点,包含了项目的构建指令。以下是一些关键知识点: 1. **CMake命令**:CMake提供了一系列的命令,如`...

    cmake教程,cmake实践,跟我一起写Makefile,三本合一带书签

    这个压缩包包含了三本书籍资源,分别是“cmake教程”、“cmake实践”以及“跟我一起写Makefile”,它们都是帮助学习和理解CMake的强大工具。 在"cmake教程"中,你可以学习到CMake的基础知识,包括如何安装CMake、...

    cmake学习手册集合包括《cmake教程》《cmake开发手册详解》《cmake中文手册》

    cmake学习手册集合包括《cmake教程》《cmake开发手册详解》《cmake中文手册》

    cmake 教程

    ### CMake教程:简明使用指南 #### 一、引言 CMake 是一个流行的开源构建系统生成器,被广泛应用于跨平台软件开发项目中。它通过读取一系列的脚本文件(通常命名为 `CMakeLists.txt`)来生成特定于操作系统的构建...

    cmake教程代码示例

    在“cmake教程代码示例”中,我们可以期待找到一系列展示 CMake 使用方法的代码片段和项目结构。这些示例通常包括如何设置项目的基本信息,如何添加源文件,如何指定目标(如执行文件或库),以及如何链接依赖的库。...

    CMake教程案例举例.zip

    cmake教程查找并包含第三方库 如果你的项目依赖于第三方库,并且这些库不是系统默认的,你可以使用find_package和find_library命令来查找它们。 CMakeLists.txt (使用FindBoost.cmake模块来查找Boost库) cmake ...

    linux下面cmake教程hello-cmake.md

    linux下面cmake教程hello-cmake.md linux下面cmake教程hello-cmake.md linux下面cmake教程hello-cmake.md linux下面cmake教程hello-cmake.md linux下面cmake教程hello-cmake.md linux下面cmake教程hello-cmake.md ...

    CMake入门教程pdf

    CMake入门教程 CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。它能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。...

    cmake教程 详细的学习教程

    【cmake教程详细的学习教程】 cmake是一款强大的跨平台构建工具,主要负责管理和构建软件项目的编译过程。自2001年诞生以来,cmake因其简单易学、灵活多变的特点,逐渐受到广大开发者的青睐,特别是在KDE4项目采用...

Global site tag (gtag.js) - Google Analytics