Cmake 入门

Cmake 入门

前言

  • CMake是一个比make更高级的编译配置工具,它可以根据不同平台、不同的编译器,生成相应的Makefile或者vcproj项目
  • 通过编写CMakeLists.txt,可以控制生成的Makefile,从而控制编译过程。CMake自动生成的Makefile不仅可以通过make命令构建项目生成目标文件,还支持安装(make install)、测试安装的程序是否能正确执行(make test,或者ctest)、生成当前平台的安装包(make package)、生成源码包(make package_source)、产生Dashboard显示数据并上传等高级功能,只要在CMakeLists.txt中简单配置,就可以完成很多复杂的功能,包括写测试用例。
  • 如果有嵌套目录,子目录下可以有自己的CMakeLists.txt。

下载

下载网页
https://cmake.org/download/
下载地址
https://cmake.org/files/v3.9/cmake-3.9.2-win64-x64.msi

示例

结构


├── build
    
├── include
|    └── add.h
└── src
    ├── add.c
    └── main.c
── CMakeLists.txt


代码

  • add.h
int add(int a,int b);
  • add.c
#include "../include/add.h"
int add(int a,int b)
{
    return a+b;
}
  • main.c
#include "../include/add.h"
#include <stdio.h>
int main(int argc,char** argv)
{
    int reslut=add(3,4);
    printf("结果 %d ",reslut);
    return 0;
}
  • CMakeLists.txt
#1.cmake verson,指定cmake版本 
cmake_minimum_required(VERSION 2.6)
#2.project name,指定项目的名称,一般和项目的文件夹名称对应
PROJECT(main)

#包含的头文件目录  
INCLUDE_DIRECTORIES(
include
)

#指定源文件目录
AUX_SOURCE_DIRECTORY(src DIR_SRCS)


MESSAGE(STATUS "开始构建")       
#设置
SET(TEST_MATH ${DIR_SRCS})
ADD_EXECUTABLE(${PROJECT_NAME} ${TEST_MATH})
  • CMake命令是大小写不敏感的,你可以用大写,也可以用小写,也可以混写。
  • ${CMAKE_CURRENT_SOURCE_DIR}表示CMakeLists.txt所在的目录

语法

  1. 注释

  2. 变量:使用set命令显式定义及赋值,在非if语句中,使用${}引用,if中直接使用变量名引用;
    后续的set命令会清理变量原来的值;

  3. command (args ...)
    命令不分大小写,参数使用空格分隔,使用双引号引起参数中空格

  4. set(var a;b;c) <=> set(var a b c)
    定义变量var并赋值为a;b;c这样一个string list

  5. Add_executable(${var}) <=> Add_executable(a b c)
    变量使用${xxx}引用

  6. 条件语句:
    if(var) #var 非empty 0 N No OFF FALSE... #非运算使用NOT

else()/elseif() … endif(var)

  1. 循环语句
    Set(VAR a b c)
    Foreach(f ${VAR}) …Endforeach(f)

  2. 循环语句
    WHILE() … ENDWHILE()

内部变量

  1. CMAKE_C_COMPILER:指定C编译器
  2. CMAKE_CXX_COMPILER:
  3. CMAKE_C_FLAGS:编译C文件时的选项,如-g;也可以通过add_definitions添加编译选项
  4. EXECUTABLE_OUTPUT_PATH:可执行文件的存放路径
  5. LIBRARY_OUTPUT_PATH:库文件路径
  6. CMAKE_BUILD_TYPE::build 类型(Debug, Release, ...),CMAKE_BUILD_TYPE=Debug
  7. BUILD_SHARED_LIBS:Switch between shared and static libraries

命令

  • 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”):

  • 在指定目录下搜索一个库, 保存在变量MY_LIB中

find_ibrary(MY_LIB libmylib.a ./)

  • set_target_properties( ... ):

lots of properties... OUTPUT_NAME, VERSION,....

  • link_libraries( lib1 lib2 ...):

All targets link with the same set of libs

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • 1.安装 $sudo apt-get install cmake 2.示例:简单的文件目录 sample |—...
    荷包蛋酱阅读 29,613评论 0 15
  • 注:首发地址 1. 前言 当在做 Android NDK 开发时,如果不熟悉用 CMake 来构建,读不懂 CMa...
    cfanr阅读 24,238评论 1 53
  • CMake学习 本篇分享一下有关CMake的一些学习心得以及相关使用。 本文目录如下: [1、CMake介绍] [...
    AlphaGL阅读 12,219评论 11 79
  • 文章翻译自:CMake Tutorial 第一步 | 第二步 | 第三步 | 第四步 | 第五步 | 第六步 | ...
    汪坤阅读 13,972评论 1 23
  • CC羽毛阅读 132评论 0 0