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

  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)

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

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

release模式声明

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

-lpthread声明

find_package(Threads)
TARGET_LINK_LIBRARIES(logic	${LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})

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

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

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值