在linux 下进行开发很多人选择编写makefile 文件进行项目环境搭建,而makefile 文件依赖关系复杂,工作量很大,搞的人头很大。采用自动化的项目构建工具cmake 可以将程序员从复杂的makefile 文件中解脱出来。cmake 根据内置的规则和语法来自动生成相关的makefile 文件进行编译,同时还支持静态库和动态库的构建,我把工作中用到的东东总结在此,方便忘记时随时查看,具体cmake的介绍和详细语法还是参考官方文档(http://www.cmake.org/),有一篇中文的cmake 实践 写的不错,可以google一下。

使用cmake 很简单,只需要执行cmake, make 两个命令即可,用我工作中的一个工程举例说明。

假设当前的项目代码在src 目录。 src 下有子目录:server, utility, lib, bin, build

server -----  存放项目的主功能类文件

utility  -----  存放项目要用到相关库文件,便已成为库文件存放到子目录lib 中

lib       -----  存放utility 生成的库

bin      -----  存放association 生成的二进制文件

build   -----  编译目录,存放编译生成的中间文件

cmake 要求工程主目录和所有存放源代码子目录下都要编写CMakeLists.txt 文件,注意大小写(cm 大写,list中l 大写且落下s).

src/CMakeLists.txt 文件如下:

-------------------------------------------------------------------------------------------------------------

#cmake file for project association                     #表示注释
      #author:>---double__song
      #created:>--2011/03/01

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)      #cmake 最低版本要求,低于2.6 构建过程会被终止。

PROJECT(server_project)                                             #定义工程名称

MESSAGE(STATUS "Project: SERVER")               #打印相关消息消息
      MESSAGE(STATUS "Project Directory: ${PROJECT_SOURCE_DIR}")

SET(CMAKE_BUILE_TYPE DEBUG)                      #指定编译类型

SET(CMAKE_C_FLAGS_DEBUG "-g -Wall")          #指定编译器
     
      ADD_SUBDIRECTORY(utility)                              #添加子目录
      ADD_SUBDIRECTORY(server)
    -------------------------------------------------------------------------------------------------------------

相关解释:

1. CMakeLists.txt 文件中不区分大小写

2. PROJECT(project_name)    定义工程名称

语法:project(projectname [cxx] [c] [java])

可以指定工程采用的语言,选项分别表示:C++, C, java, 如不指定默认支持所有语言

3. MESSAGE(STATUS, "Content")  打印相关消息

输出消息,供调试CMakeLists.txt 文件使用。

4. SET(CMAKE_BUILE_TYPE DEBUG)  设置编译类型debug 或者release。 debug 版会生成相关调试信息,可以使用GDB 进行

调试;release不会生成调试信息。当无法进行调试时查看此处是否设置为debug.

5. SET(CMAKE_C_FLAGS_DEBUG "-g -Wall") 设置编译器的类型

CMAKE_C_FLAGS_DEBUG            ----  C 编译器

CMAKE_CXX_FLAGS_DEBUG        ----  C++ 编译器

6. ADD_SUBDIRECTORY(utility) 添加要编译的子目录

为工程主目录下的存放源代码的子目录使用该命令,各子目录出现的顺序随意。

如上便是工程server_project 主目录src 下的CMakeLists.txt 文件,下一篇我们解释子目录utiltiy中的CMakeLists.txt 文件。

子目录utility 下的CMakeLists.txt 文件如下:

--------------------------------------------------------------------------------------------------------------------
     #Cmake file for library utility.a
     #Author:       double__song
     #Created:     2011/3/3

SET(SOURCE_FILES                                  #设置变量,表示所有的源文件
     ConfigParser.cpp
     StrUtility.cpp
     )

INCLUDE_DIRECTORIES(                          #相关头文件的目录
     /usr/local/include
     ${PROJET_SOURCE_DIR}/utility
     )

LINK_DIRECTORIES(                                  #相关库文件的目录
    /usr/local/lib

)

ADD_LIBRARY(association ${SOURCE_FILES})         #生成静态链接库libassociation.a

TARGET_LINK_LIBRARY(association core)                #依赖的库文件

SET_TARGET_PROPERTIES(utility  PROPERTIES    #表示生成的执行文件所在路径
    RUNTIME_OUTPUT_DIRECTORY> "${PROJECT_SOURCE_DIR}/lib")

--------------------------------------------------------------------------------------------------------------------
    相关解释:

1. SET(SOURCE_FILES .....)

表示要编译的源文件,所有的源文件都要罗列到此处。set 设置变量,变量名SOURCE_FILES自定义。

2. INCLUDE_DIRECTORY(...)

include头文件时搜索的所有目录

变量PROJECT_SOURCE_DIR 表示工程所在的路径,系统默认的变量

3. LINK_DIRECTORIES(...)

库文件存放的目录,在程序连接库文件的时候要再这些目录下寻找对应的库文件

4. ADD_LIBRARY(...)

表示生成静态链接库libassociaiton.a,由${PROJECT_SOURCE_DIR}代表的文件生成。

语法:ADD_LIBRARY(libname [SHARED|STATIC]

SHARED 表示生成动态库, STATIC表示生成静态库。

5. TARGET_LINK_LIBRARY(association core)

表示库association 依赖core库文件

6. SET_TARGET_PROPERTIES

设置编译的库文件存放的目录,还可用于其他属性的设置。如不指定,

生成的执行文件在当前编译目录下的各子目录下的build目录下,好拗口!简单一点:

如指定在: ./src/lib 下

不指定在: ./src/build/utility/build 目录下

生成的中间文件在./src/build/utilty/build 目录下,不受该命令额影响

     子目录server 下的CMakeLists.txt 文件:

--------------------------------------------------------------------------------------------
     SET(SOURCE_FILES
     Gassociation.cpp
     ConfigurationHandler.cpp
     )

INCLUDE_DIRECTORIES(

/usr/local/include
      ${PROJECT_SOURCE_DIR}/utility
      ${PROJECT_SOURCE_DIR}/association
     )

LINK_LIBRARIES(
     /usr/local/lib
     ${PROJECT_SOURCE_DIR}/lib
     )

ADD_EXECUTABLE(server  ${SOURCE_FILES})

TARGET_LINK_LIBRARIES(server
     utility

SET_TARGET_PROPERTIES(server  PROPERTIES    #表示生成的执行文件所在路径
     RUNTIME_OUTPUT_DIRECTORY  "${PROJECT_SOURCE_DIR}/bin")

-------------------------------------------------------------------------------------------------------

相关解释:

1. ADD_EXECUTABLE()     #指定要生成的执行文件的名称server

其他用法同utilty/CMakeLists.txt

2. SET_TARGET_PROPERTIES

设置生成的执行文件存放的路径,

注意:

执行文件server 依赖的子目录utility 子目录生成的静态库libutility.a,在指定的时候要写成:
      TARGET_LINK_LIBRARIES(server   utility)

而不能写成:

TARGET_LINK_LIBRARIES(server   libutility.a)

否则编译总会提示找不到libutility库文件。

但使用第三方的库却要指定成具体的库名,如:libACE-6.0.0.so

这一点很诡异,暂时还没找到原因。

完成对应的CMakeLists.txt 文件编写后,便可以进行编译了。

编译:

进入 ./src/build

执行cmake ..

make

cmake 的使用很简单,更高级的应用好比版本信息,打包,安装等相关基本的应用后面会一一介绍,

复杂的语法使用要参考官方文档。

cmake使用总结(转)---工程主目录CMakeList文件编写相关推荐

  1. Win平台使用cmake工具生成sln工程示例

    先安装一个版本的cmake,3.17.2; 这应该是比较新的版本:我看到有的示例是3.7以下版本: cmake加到系统path变量: 安装完成: 新建一个C#prj目录,下面放一个cs文件,新建一个m ...

  2. CMake 使用方法 CMakeList.txt编写简单分析

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

  3. CMake使用详解一(单文件编译)

    文章目录 1 什么是CMake 2 单个源文件编译 2.1 编写单个cpp文件 2.2 编写CMakeLists.txt 2.3 使用`cmake .`和`make`编译项目 2.3.1 执行`cma ...

  4. CMake管理VS+Qt工程

    CMake:是一个比make更高级的编译配置工具,它可以根据不同平台.不同的编译器,生成相应的Makefile或者vcproj项目. 近期使用Visual Studio 2015 建立了Qt工程,不使 ...

  5. “轻松搞定CMake”系列之CMakeLists文件编写语法规则详解

    文章目录 基本语法规则 常见CMakeLists.txt中指令剖析 从VS项目配置过程理解CMakeLists内容 CMake中常用变量汇总 常用CMakeLists文件模板 基础模板 使用OpenC ...

  6. CMake使用详解二(多文件编译)

    文章目录 1 同一目录,多个源文件 1.1 创建2个源文件 1.2 编写CMakeLists.txt 1.3 编译项目 2 多个目录,多个源文件 2.1 在不同的目录下新建源代码 2.2 编写CMak ...

  7. 【SeeMusic】创建 SeeMusic 工程并编辑相关内容 ( 创建工程 | 导入 MIDI 文件 | 导入音频 | 导入视频 )

    SeeMusic 系列文章目录 [SeeMusic]下载安装并注册 SeeMusic 软件 [SeeMusic]创建 SeeMusic 工程并编辑相关内容 ( 创建工程 | 导入 MIDI 文件 | ...

  8. 安卓工程版本控制哪些文件可以忽略

    安卓工程版本控制哪些文件可以忽略 可以省略的文件如下: 目录 .gradle gradle的临时目录 .idea gradle的临时目录 build gradle的临时目录 文件 *.iml后缀文件 ...

  9. Qt中为工程添加资源文件、给按钮添加图片

    Qt中为工程添加资源文件.给按钮添加图片 1.使用QIcon类.代码如下: QIcon icon;icon.addFile(tr("res/icon/wall.png"));ui- ...

最新文章

  1. 五、唱歌不如跳舞(下)
  2. Python基础学习----参数和返回值
  3. laravel安装笔记
  4. listView 多布局
  5. 《vue2.0基础系列》目录大全,你要的都在这里
  6. 面试官:Java为什么只有值传递?
  7. c语言中如何确保一个程序是单例的_c++单例模式
  8. VMware vSphere Replication Appliance 的内部版本号和版本 (2143840)-2020-10-27更新
  9. SQL Server安全性和基于策略的管理–高级条件
  10. QTCreator中字符编码问题以及WINDOWS API A/W两种版本的说明
  11. 学习笔记(1):C#Winform水晶报表实例教程-设计带图片的水晶报表
  12. matlab南方平差易,测量平差实习心得多篇
  13. 连接mysql失败怎么办_数据库连接失败有什么原因?怎么解决?
  14. 北大美女辞去公司副总职务创业养狗
  15. 告诉你Windows PE 是什么东东?详细介绍一下winpe
  16. 销售额高达2.8亿的 “像素猫头鹰”项目Moonbirds,何以令NFT收藏家趋之若鹜?
  17. oracle bom递归查询,求多阶BOM查询代码
  18. python从入门到入魔第八天——turtle库使用(含玫瑰花绘制实例)
  19. POI读写超大数据量Excel,解决超过几万行而导致内存溢出的问题(附源码)
  20. 黑莓手机OTA在线下载安装软件使用教程

热门文章

  1. html图片自动循环轮播图,js实现图片无缝循环轮播
  2. php常量变量连接,PHP常量及变量区别原理详解
  3. 多益网络 视频面试面试总结20180816
  4. node.js 获取异步方法里面数据 的方式
  5. 【Java学习笔记七】常用数据对象之数组
  6. Linux中wait()函数及waitpid()函数
  7. 【Linux】Ubuntu 18下安装Vim自动补全插件YouCompleteMe(可高速下载安装)
  8. 【汇编语言】汇编语言如何编程,如何避免出错
  9. java高分面试指南:redis怎么保证高可用
  10. 疯狂涨知识!Java多态实现原理技术总监都拍手叫好