Cmake 入门

作者: 渝潼不肖生 | 来源:发表于2017-09-18 11:54 被阅读110次

    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

    相关文章

      网友评论

        本文标题:Cmake 入门

        本文链接:https://www.haomeiwen.com/subject/zravsxtx.html