c++cmake及包管理⼯具conan简单⼊门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 ⽂件的上⼀级⽬录中要有⽂件,即cmake的描述⽂件
cmake --build [target]
开始编译,[target]是上⼀步存放cmake⽣成⽂件的⽬录,如果我们在该⽬录中使⽤cmake --build .即可
1.3 cmake描述⽂件初体验
(1)声明需要的cmake的最低版本: 这⾏必须在描述⽂件的第⼀⾏,这⾥我设置的最低版本是3.16
cmake_minimum_required(VERSION 3.16)
(2) 添加项⽬名: 这⾥我把项⽬名称设置为cmake
project(cmake)
(3) 添加可执⾏⽂件名:这⾥我设置的可执⾏⽂件名是cmake,他依赖的⽂件是main.cpp,在编译完成后回⽣成cmake.out或⽂件
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) ⽣成静态链接库:有时候我们的⽂件可能分散在多个⽂件夹中,这时我们就可以通过⽣成静态库的⽅式将他们链接并⽣成可执⾏⽂件,我们需要在⼦⽂件中同样包含⽂件,然后添加
add_library(libmyHeap STATIC ${CMAKE_CURRENT_SOURCE_DIR}/MyHeap.cpp) # 当前库⽂件
target_include_directories(libmyHeap PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) # 头⽂件
这⾥通过add_library()指定⽣成库,libmyHeap是库的名字,STATIC 指定⽣成的静态库,${CMAKE_CURRENT_SOURCE_DIR}/MyHeap.cpp指定我们⽣成库依赖源⽂件的路径
${CMAKE_CURRENT_SOURCE_DIR}表⽰当前所在的⽂件路径
target_include_directories()指定⽣成库依赖的头⽂件
libmyHeap是⽣成静态库的名字
PUBLIC表⽰当前静态库的依赖可以被上层cmake发现,同时该库也依赖该头⽂件,当然还有其它设置,作为⼊门不做介绍
${CMAKE_CURRENT_SOURCE_DIR}表⽰当前所在的⽂件路径
通过这两句命令即可⽣成⼀个静态库,要想能被可执⾏程序链接到,我们只需在顶层⽂件中添加
add_subdirectory(myHeap) # 添加⼦⽬录搜索路径以及
target_link_libraries(cmake libmyHeap)
⾸先,第⼀句add_subdirectory()指定底层的路径,这样我们的顶层就能到并编译
target_link_libraries()第⼀个参数指定target即我们的项⽬名,第⼆个参数指定要链接的库名
由于我们在上⾯设置⽣成静态库时设置可见属性为PUNLIC 因此这⾥不需要指定头⽂件路径,cmake就可以通过底层 到我们需要的头⽂件,这也是现代cmake的做法
以上就是cmake的基本使⽤,我们可以把⽂件放在不同⽂件夹,并通过⽣成静态库的⽅式将各个⽂件链接起来,这⾥列出总的⽂件
顶层
cmake_minimum_required(VERSION 3.16)  # 设置cmake最低版本
project(cmake VERSION 1.0.0 LANGUAGES CXX) # 设置⽂件名及版本信息
set(CMAKE_CXX_STANDARD 14) # 设置c++版本
add_subdirectory(myHeap) # 添加⼦⽬录搜索路径,这⾥值myHeap路径
add_executable(cmake main.cpp) # 添加可执⾏⽂件
target_link_libraries(cmake libmyHeap)  # 链接库名称
底层
add_library(libmyHeap STATIC ${CMAKE_CURRENT_SOURCE_DIR}/MyHeap.cpp) # 当前库⽂件
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配置⽂件
<这⾥包含两项,第⼀项是要下载的库和版本号,第⼆项是指定⽣成的管理格式,这⾥我们选择cmake
以使⽤poco库为例,我们只需在中写
[requires]
poco/1.11.1
[generators]
cmake
这⾥我们怎么知道所使⽤的库有哪些版本呢?
可以使⽤命令conan search poco -r conancenter获取,其中-r conancenter指定我们需要在conan中央仓库搜索,否则默认本地搜索,要添加其它库,直接在[requires]下添加库名和版本号,然后重新安装就好了
2.3 安装库
我们以及创建好好conan配置⽂件,下⼀步,进⼊build⽂件夹(这个⽂件夹就是我们存放cmake⽣成⽂件的地⽅哦),然后⼀⾏命令conan install .即可静静等待下载安装完成了
注意事项: 这个时候可能需要我们指定⼀些配置信息,配置信息在~/.conan/profiles/default⽂件⾥,配置信息需要添加的内容
在~/.l⽂件⾥,对于gcc,需要配置compiler.libcxx=libstdc++11否则以旧版本安装,这⾥列出我的配置⽂件供参考[settings]
os=Linux
os_build=Linux
arch=x86_64
arch_build=x86_64
build_type=Release
compiler=gcc
compiler.libcxx=libstdc++11
compiler.version=9
[options]
[build_requires]
[env]
在这插⼀条刚刚吃完饭准备把build⽂件夹的缓存删了,然后测试⼀下看看写的对不对,准备输rm -rf build/* 结果输成了rm -rf /*,好家伙.....⾃闭中...
2.4 在cmake中配置
只需要在顶层⽂件中添加
include(${CMAKE_BINARY_DIR}/ake)
conan_basic_setup()
${CMAKE_BINARY_DIR}表⽰当前build⽂件夹路径, 然后在mian.cpp⾥引⽤头⽂件即可
2.5 使⽤
现在我么可以使⽤cmake编译我们我们的⼯程了
进⼊到build⽂件夹下,输⼊cmake ..等待⽣成makefile⽂件完成后,输⼊cmake build .等待编译成功了
附录
附录1:cmake变量常⽤变量
PROJECT_SOURCE_DIR:⼯程的根⽬录,顶层所在的⽬录
PROJECT_BINARY_DIR:cmake⽣成⽂件保存的⽬录,通常为build⽬录
PROJECT_NAME:项⽬名
CMAKE_CURRENT_SOURCE_DIR:当前所在的路径
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:更进⼀步的学习链接
cmake如何使用
1. 知乎: 很酷的程序员 cmke
2.  CSDN: weixin_39773239 cmake
3.  B站:IPADS cmake
4.  B站: bennyhuo不是算命的 conan
5.  cmake官⽅⽂档

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。