cmake是一个跨平台的c/c++工程管理工具,可以通过cmake轻松管理我们的项目

conan是一个包管理工具,能够自动帮助我们下载及管理依赖,可以配合cmake使用

这是一个入门教程,想深入了解的我在后面放了几个链接可以去学习

1 cmake

1.1 下载cmake

1.2 cmake的主要命令

cmake -B [target]

[target] 表示我们希望cmake生成文件存放的目录,一般命名为build, 我们也可以进入到build文件夹下使用cmake .. 将cmake生成的文件存放到当前目录

这个命令作用是自动帮我们生成makefile文件

注意事项:build 文件的上一级目录中要有CMakeLists.txt文件,即cmake的描述文件

cmake --build [target]

开始编译,[target]是上一步存放cmake生成文件的目录,如果我们在该目录中 使用cmake --build . 即可

1.3 cmake描述文件CMakeLists.txt初体验

(1)声明需要的cmake的最低版本: 这行必须在描述文件的第一行,这里我设置的最低版本是3.16

cmake_minimum_required(VERSION 3.16)

(2) 添加项目名: 这里我把项目名称设置为cmake

project(cmake)

(3) 添加可执行文件名:这里我设置的可执行文件名是cmake,他依赖的文件是main.cpp,在编译完成后回生成cmake.out或cmake.exe文件

add_executable(cmake main.cpp)

以上三行代码就简单定义好一个cmake描述文件了,这三行也是一个camke描述文件必不可少的

1.4 cmake描述文件再探

上一节介绍了cmake的简单使用,我们的工程不会只有一个文件,也不会只有一个文件夹,否则也不会使用cmake来帮助我们管理,接下来介绍cmake的更多用法

(1) 设置c++版本:指定c++最低编译版本,这里我设置的是14

set(CMAKE_CXX_STANDARD 14)

(2) 指定工程的版本号及语言:使用1.3节第(2)步的命令我们可以为工程设置版本号和指定语言,这里设置的版本号是1.0.0,语言CXX表示c++, 我们可以设置4个字段的版本信息,通过使用配置文件生成头文件在我们的项目中使用版本信息, 4个字段见附录

project(cmake VERSION 1.0.0 LANGUAGES CXX)

(3) 生成静态链接库: 有时候我们的文件可能分散在多个文件夹中,这时我们就可以通过生成静态库的方式将他们链接并生成可执行文件,我们需要在子文件中同样包含CMakeLists.txt文件,然后添加

  1. add_library(libmyHeap STATIC ${CMAKE_CURRENT_SOURCE_DIR}/MyHeap.cpp) # 当前库文件
  2. target_include_directories(libmyHeap PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) # 头文件

这里通过add_library()指定生成库,libmyHeap 是库的名字,STATIC 指定生成的静态库,${CMAKE_CURRENT_SOURCE_DIR}/MyHeap.cpp 指定我们生成库依赖源文件的路径

${CMAKE_CURRENT_SOURCE_DIR}表示当前CMakeLists.txt所在的文件路径

target_include_directories() 指定生成库依赖的头文件

libmyHeap是生成静态库的名字

PUBLIC 表示当前静态库的依赖可以被上层cmake发现,同时该库也依赖该头文件,当然还有其它设置,作为入门不做介绍

${CMAKE_CURRENT_SOURCE_DIR} 表示当前CMakeLists.txt所在的文件路径

通过这两句命令即可生成一个静态库,要想能被可执行程序链接到,我们只需在顶层CMakeLists.txt文件中添加

add_subdirectory(myHeap) # 添加子目录搜索路径 以及

target_link_libraries(cmake libmyHeap)

首先,第一句add_subdirectory()指定底层CMakeLists.txt的路径,这样我们的顶层CMakeLists.txt就能找到并编译

target_link_libraries()第一个参数指定target即我们的项目名,第二个参数指定要链接的库名

由于我们在上面设置生成静态库时设置可见属性为PUNLIC 因此这里不需要指定头文件路径,cmake就可以通过底层CMakeLists.txt 找到我们需要的头文件,这也是现代cmake的做法

以上就是cmake的基本使用,我们可以把文件放在不同文件夹,并通过生成静态库的方式将各个文件链接起来,这里列出总的CMakeLists.txt文件

顶层CMakeLists.txt

  1. cmake_minimum_required(VERSION 3.16) # 设置cmake最低版本
  2. project(cmake VERSION 1.0.0 LANGUAGES CXX) # 设置文件名及版本信息
  3. set(CMAKE_CXX_STANDARD 14) # 设置c++版本
  4. add_subdirectory(myHeap) # 添加子目录搜索路径,这里值myHeap路径
  5. add_executable(cmake main.cpp) # 添加可执行文件
  6. target_link_libraries(cmake libmyHeap) # 链接库名称

底层CMakeLists.txt

  1. add_library(libmyHeap STATIC ${CMAKE_CURRENT_SOURCE_DIR}/MyHeap.cpp) # 当前库文件
  2. target_include_directories(libmyHeap PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) # 头文件

文件结构

Ok,上面就列出了cmake的简单使用,有时候我们写项目的时候需要使用别人写的库,这个时候一般会下载源码在本地编译或者下载对应版本的编译后的文件,但是我们使用的库还可能包含别人的库,别人的库可能还使用了别别人写的库,这样一个个下载编译太过麻烦,而且有些库还存在多次引入的可能,因此我们需要一个工具帮助我们管理包和依赖,这里介绍conan

2 conan

conan是一个c++包管理工具,一行代码就能将我们需要的包下载到本地并进行编译

注意:目前已知在windows + gcc存在bug,导致编译失败,我也不知什么原因,stackoverflow上有一个提问,说是由于兼容性问题,这里我是直接在linux平台使用

2.1 下载conan

下载很简单,直接通过pip下载

pip install conan

稍等片刻,就下载好了,这个时候如果我们输入conan --version 可能会找不到命令,这是因为环境变量没有添加,添加环境变量网上教程很多

2.2 添加conan配置文件

conanfile.txt这里包含两项,第一项是要下载的库和版本号,第二项是指定生成的管理格式,这里我们选择cmake

以使用poco库为例,我们只需在conanfile.txt中写

  1. [requires]
  2. poco/1.11.1
  3. [generators]
  4. cmake

这里我们怎么知道所使用的库有哪些版本呢?

可以使用命令conan search poco -r conancenter 获取,其中-r conancenter指定我们需要在conan中央仓库搜索,否则默认本地搜索,要添加其它库,直接在[requires]下添加库名和版本号,然后重新安装就好了

2.3 安装库

我们以及创建好好conan配置文件,下一步,进入build文件夹(这个文件夹就是我们存放cmake生成文件的地方哦),然后一行命令conan install . 即可静静等待下载安装完成了

注意事项: 这个时候可能需要我们指定一些配置信息,配置信息在~/.conan/profiles/default文件里,配置信息需要添加的内容在~/.conan/settings.yml文件里,对于gcc,需要配置compiler.libcxx=libstdc++11 否则以旧版本安装,这里列出我的配置文件供参考

  1. [settings]
  2. os=Linux
  3. os_build=Linux
  4. arch=x86_64
  5. arch_build=x86_64
  6. build_type=Release
  7. compiler=gcc
  8. compiler.libcxx=libstdc++11
  9. compiler.version=9
  10. [options]
  11. [build_requires]
  12. [env]

在这插一条 刚刚吃完饭准备把build文件夹的缓存删了,然后测试一下看看写的对不对,准备输rm -rf build/* 结果输成了rm -rf /*,好家伙.....自闭中...

2.4 在cmake中配置

只需要在顶层CMakeLists.txt文件中添加

  1. include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
  2. conan_basic_setup()

${CMAKE_BINARY_DIR}表示当前build文件夹路径, 然后在mian.cpp里引用头文件即可

2.5 使用

现在我么可以使用cmake编译我们我们的工程了

进入到build文件夹下,输入cmake .. 等待生成makefile文件完成后,输入cmake build .等待编译成功了

附录

附录1:cmake变量常用变量

PROJECT_SOURCE_DIR:工程的根目录,顶层CMakeLists.txt所在的目录

PROJECT_BINARY_DIR:cmake生成文件保存的目录,通常为build目录

PROJECT_NAME:项目名

CMAKE_CURRENT_SOURCE_DIR:当前CMakeLists.txt所在的路径

EXECUTABLE_OUTPUT_PATH:重新定义目标二进制可执行文件的存放位置

LIBRARY_OUTPUT_PATH:重新定义目标链接库文件的存放位置

使用格式 ${value}

附录2: 版本号字段 PROJECT-NAME:当前项目名

PROJECT-NAME_VERSION_MAJOR:第一个字段

PROJECT-NAME_VERSION_MINOR:第二个字段

PROJECT-NAME_VERSION_PATCH:第三个字段

PROJECT-NAME_VERSION_TWEAK:第四个字段

附录3:更进一步的学习链接

  1. https://www.zhihu.com/column/c_1369781372333240320 知乎: 很酷的程序员 cmke
  2. https://blog.csdn.net/weixin_39773239/article/details/113052000 CSDN: weixin_39773239 cmake
  3. https://www.bilibili.com/video/BV14h41187FZ B站:IPADS cmake
  4. https://www.bilibili.com/video/BV1wL411u74B B站: bennyhuo不是算命的 conan
  5. https://cmake.org/cmake/help/v3.22/ cmake官方文档

c++ cmake及包管理工具conan简单入门的更多相关文章

  1. c++包管理工具conan

    Conan is a portable package manager, intended for C and C++ developers, but it is able to manage bui ...

  2. PHP包管理工具composer简单总结

    前言 接触laravel之后,才知道有PSR,composer之类的东西,PHP已经不再是一门草根语言了.最近在尝试玩thrift,需要安装PHP thrift依赖库,使用composer insta ...

  3. Node包管理工具

    Node包管理工具 只是简单的介绍一些工具的使用,有利于开发过程.除了介绍Node包管理工具,还介绍了前端打包工具,前端模块管理工具 Node包管理工具:    --npm    --cnpm    ...

  4. Python黑帽编程1.3 Python运行时与包管理工具

    Python黑帽编程1.3  Python运行时与包管理工具 0.1  本系列教程说明 本系列教程,采用的大纲母本为<Understanding Network Hacks Attack and ...

  5. 包管理工具Carthage使用

    iOS项目中第三方开源库的工具有Cocoapods和Carthage,swift官方出了一个包管理工具SPM(Swift Package Manager). 首先,大体讲一下Cocoapods和Car ...

  6. 【转载】Python的包管理工具Pip

    接触了Ruby,发现它有个包管理工具RubyGem很好用,并且有很完备的文档系统http://rdoc.info 发现Python下也有同样的工具,包括easy_install和Pip.不过,我没有细 ...

  7. Python的包管理工具Pip (zz )

    Python的包管理工具Pip 接触了Ruby,发现它有个包管理工具RubyGem很好用,并且有很完备的文档系统http://rdoc.info 发现Python下也有同样的工具,包括easy_ins ...

  8. python 包管理工具

    python 包管理工具 Python当前的包管理工具链是 easy_install/pip + distribute/setuptools + distutils,显得较为混乱. 而将来的工具链组合 ...

  9. Python 包管理工具解惑

    Python 包管理工具解惑 本文链接:http://zengrong.net/post/2169.htm python packaging 一.困惑 作为一个 Python 初学者,我在包管理上感到 ...

随机推荐

  1. python中yield的理解

    首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的,最浅显易懂 ...

  2. tar 解压分割压缩文件

    被分割后的压缩文件必须先合并成一个压缩文件才能正常的解压. 第一步.合并压缩文件 第二步.正常解压 $ls TINA-1.3.tar.gzaa TINA-1.3.tar.gzab TINA-1.3.t ...

  3. Linux修改bashrc

    .bashrc是一个隐藏的文件,要打开并修改该文件需要: (1) 查看:ll -a 找到文件 .bashrc: (2) 打开:vi .bashrc (或者 vim .bashrc) 打开文件: (3) ...

  4. hdu 1159 Common Subsequence(最长公共子序列,DP)

    题意: 两个字符串,判断最长公共子序列的长度. 思路: 直接看代码,,注意边界处理 代码: char s1[505], s2[505]; int dp[505][505]; int main(){ w ...

  5. nginx + tomcat 实现负载均衡

    1.环境准备 服务器A上安装 nginx 作为代理服务器 服务器B上安装 tomcat,~/webapps 下创建 /test目录,创建 /index.html 内容为T1(生产环境中一般是一样的wa ...

  6. 字符编码之间的转换 utf-8 , gbk等,(解决中文字符串乱码)

    目录 1.背景. 2.编码的理解 3.编码之间的相互转化 4. str类型说明 5. 可以使用的编码类型 6.参考文章 1.背景 Python中与其他程序进行交互时,如果存在字符串交互,特别是字符串中 ...

  7. RF运行之后控制信息日志显示乱码(解决方法)

    RIDE运行自动化测试案例时,控制台信息显示乱码,如下所示: 解决方法:进入到python的安装路径下:D:\python37\Lib\site-packages\robotide\contrib\t ...

  8. springboot如何通过apollo动态去注册dubbo服务

    参考相关文章: apollo官方文档:  https://dubbo.apache.org/zh/docs/v2.7/user/configuration/configuration-load-pro ...

  9. Express 的基本使用(创建一个简单的服务器)

    Express 的基本使用(创建一个简单的服务器) const express = require('express') // 创建服务器应用程序 // 相当于 http.creatServer co ...

  10. 计算机网络-3-5-以太网MAC层及交换机

    MAC层的硬件地址 在局域网中,硬件地址又称为物理地址或者MAC地址(因为这种地址用在MAC帧中) IEEE 802标准为局域网规定了一种48位(6字节)的全球地址,固化在适配器的ROM中. 如果计算 ...