• cmake入门


      成熟的IDE为程序员屏蔽了程序运行的复杂逻辑,但对于C/C++来说,底层的编译还是由gcc/g++完成的,但对于项目中存在大量文件时,使用gcc/g++非常不方便,这个时候就可以使用cmake这个工具,只要按照规则编写配置文件,就可以自动化编译整个项目的程序。
      这篇文章的主题是cmake这个工具的使用。希望能明确以下几个问题?
      1.什么是cmake/cmake是用来干什么的?
      2.cmake的用法是什么样的?/怎么编写CMakeLists.txt文件

    1.什么是cmake?/cmake是用来干什么的?

      对于cmake的定义就是可以将多个hpp、cpp组合构建成一个大的工程项目,按照CMakeLists.txt所设定的编译规则,最终会生成makefile文件。项目执行的时候就会按照这个makefile文件的编译过程来执行。关于使用cmake生成可执行文件的流程,在之前的文章cmake,CMakeLists.txt,make,makefile的关系有过介绍
      简单点儿说cmake就是以简单的操作方式来面对项目级代码的编译运行流程(我感觉可以算的上gcc/g++的上层封装),而且cmake同样也是跨平台的,结构图如下:
    在这里插入图片描述

    2.cmake的用法是什么样的?/怎么编写CMakeLists.txt文件

      在cmake的使用中有一个常用的关于文件放置规范,一般在项目文件夹下会有几个文件夹,分类存放,比较常用的有下面几个:
      src文件夹:存放源文件(包括.cpp和.h)
      build文件夹:存放编译过程生成的文件,build下的bin文件夹存放二进制的可执行文件
      lib文件夹:存放本项目使用的静态库/动态库。
      在这个规范下编写代码,会让项目整体看起来更简洁。

      学习cmake的主要内容就是学会怎么编写CMakeLists.txt文件,文件中有许多关键字。下面对一些关键字进行介绍(按照惯例,关键字使用全部大写表示)

    关键字介绍
      PROJECT (xxx) 指定工程名称
      例:PROJECT(hello)

      SET 设置指定变量
      例:SET(LRC_LIST main.cpp) LRC_LIST变量中包含main.cpp

      MESSAGE 向终端中输出用户自定义信息
      例:MESSAGE(STATUS “message output” ${HELLO_BINARY_DIR})

      ADD_EXECUTABLE 生成可执行文件
      例:ADD_EXECUTABLE(hello $ {LRC_LIST})
      这里的${LRC_LIST}也可以直接写各源文件的名称(只写cpp)
      有的时候也会使用一些.o文件,添加和.cpp一样,直接在ADD_EXECUTABLE中添加即可

      INSTALL 安装文件
      例:INSTALL(FILES doc1 doc2 DESTINATION /usr/share/doc/cmake/) 安装到/usr/share/doc/cmake
      例:INSTALL(PROGRAMS hello.sh DESTINATION bin) 安装到/usr/bin

      ADD_SUBDIRECTORY 指定中间文件生成并存放的位置
      例:ADD_SUBDIRECTORY(src bin) 指定可执行文件生成和放在./src/bin中,常用于外层CMakeLists.txt

      INCLUDE_DIRECTORIES 向⼯程添加多个特定的库⽂件搜索路径
      例:INCLUDE_DIRECTORIES(./include) 把inlcude文件夹增加到库文件的搜索目录中

      LINK_DIRECTORIES 向⼯程添加多个特定的库⽂件搜索路径
      例:LINK_DIRECTORIES(./data/lib) lib文件夹中有动态库/静态库文件

      TARGET_LINK_LIBRARIES 可执行文件链接动态库静态库
      例:TARGET_LINK_LIBRARIES(hello libhello.so)

    静态库动态库构建
      很多情况下,不希望把程序变成可执行文件,而希望把程序变成静态库或者动态库供他人使用。下面介绍cmake构建动态库/静态库的过程(差别不大,只是CMakeLists中有改变):
      1.先写好.h和.cpp
      2.项目中有一个CMakeLists.txt, src中有一个CMakeLists.txt

      项目中的CMakeLists.txt写生成路径,src中的CMakeLists.txt写编译规则,重点有三行:
      SET(LIBHELLO_SRC hello.cpp)
      ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC}) #构建动态库,hello.so
      ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC}) #构建静态库hello_static.a

    INSTALL文件安装
      有的时候希望把文件安装到特定的路径,就使用INSTALL关键字
      将hello.h安装到/usr/include/hello
      INSTALL(FILES hello.h DESTINATION /usr/include/hello)

      静态库动态库安装,LIBRARY是动态 ARCHIVE是静态
      INSTALL(TARGETS hello hello_static LIBRARY DESTINATION /usr/lib ARCHIVE DESTINATION /usr/lib)

    C++新特性添加
      有的时候代码中用到了c++新版的特性,像C++11,C++14等等。有两种方式:
      1.在cmake编译时加入编译选项中,如下:

    #增加-std=c++11
    cmake . -DCMAKE_CXX_STANDARD=11
    #增加-std=c++14
    cmake . -DCMAKE_CXX_STANDARD=14
    #增加-std=c++17
    cmake . -DCMAKE_CXX_STANDARD=17
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

      2.在CMakeLists.txt文件中声明

    #增加-std=c++11
    set(CMAKE_CXX_STANDARD 11)
    #增加-std=c++14
    set(CMAKE_CXX_STANDARD 14)
    #增加-std=c++17
    set(CMAKE_CXX_STANDARD 17)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    dubug模式声明,开启core文件权限

    SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")
    
    • 1

    release模式声明

    SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
    
    • 1

    -lpthread声明

    find_package(Threads)
    TARGET_LINK_LIBRARIES(logic	${LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})
    
    • 1
    • 2

      总的来说,cmake生成可执行文件就是以下步骤:
        1.编写源码
        2.编写CMakeLists.txt
        3.执行cmake
        4.执行make

    参考资料:
    cmake简明教程-半小时从入门到精通
    CMake 入门教程

  • 相关阅读:
    一文了解DataStore(Preferences)
    ADS2017之S参数仿真
    【图解HTTP】| 【01】简单了解HTTP协议
    【高德地图】根据经纬度多边形的绘制(可绘制区域以及任意图形)
    [开发|JAVA] dateease编译资料笔记
    2023亿发数字化智能工单,专业管理工单处理全流程,助力企业转型腾飞
    paddle ocr模型量化实践
    CSS动画 transition和animation
    virtio frontend and backend
    Java中锁的分类
  • 原文地址:https://blog.csdn.net/gls_nuaa/article/details/126136540