linux 编译 make vc,使用clion+cmake+vcpkg的开发现代的c++跨平台程序

使用clion+cmake+vcpkg的开发现代的c++跨平台程序java

使用c++开发跨平台的程序

背景

在开发过程当中,使用c++做为开发语言,一般被认为是痛苦的,啰嗦的,超长开发时间的.最近几年有各类各样的语言被普遍使用,相对比来讲c++不是那么出彩.c++虽然年龄大,可是它不是坐以待毙的,它本身也在急剧变革,最近几年,为了方便c++的开发,涌现出很是多的工具.我结合本身的工做经验,打算写点东西,介绍一下.linux

C++诞生初期解决了很实际的问题,可是随着时代的变革c++遇到了新的状况.c++

首先就是包依赖管理,c++并无在这上面有所约束,致使开发在管理依赖包的时候,很是的困难,有时候能够说是一团糟.c++的处境,有点像nuget出现以前的c#,maven出现以前的java.不过如今这个也获得了解决.微软推出了vcpkg.此工具彻底解决了这个问题.固然,针对c++包管理,还有其余的工具,此处,我只推荐vcpkg.理由以下:1.它切合了现代c++的开发流程.2.它真的很好的管理了包以及包依赖,以及头文件.3.它易于使用.在开发过程当中每一个平台的操做方式都是一致的.git

其次项目组织方式,c++并无在这上有所约束.好吧,所处的时代的确没有考虑到将来的状况.我这里选择cmake. 段子 A:我写c++代码, B:具体的工做是? A:你具体指的是写c++代码,写c++代码的代码,以及写c++文件的代码?....虽然是段子,不过cmake就是c++文件的代码.如今也算是c++开发的标配了.程序员

再次开发工具,此处有不少选择,vs和vscode,以及clion.我选择了clion.github

最后开发的操做系统,既然是开发跨平台的程序,开发平台也须要选择一下,我选择了win10.没有选择linux桌面系统.理由简单,windows工具太多了.我如今年龄已经很大了.已通过了须要使用操做系统来体现自我逼格的阶段了.我无心争论那个系统好与坏.我如今须要的是生活的时间.(然而码农最缺乏的就是时间,其实最主要缘由是工做交流都使用win系统)再说以上工具都是跨平台的,彻底能够无缝的移植到win或者linux桌面上去.真正的彻底无缝.操做方式都不带任何变化的.编程

总之本文就是使用clion+cmake+vcpkg的开发现代的c++跨平台程序.bootstrap

项目的基本组织方式

项目是在win10中编写的,我不怕编写东西,我只是怕出了问题,不知道问题所在.因此编译和调试也占据很重要的地位,都是远程操做的.ubuntu

若是画一个图,能够以下表示.c#

linux 编译 make vc,使用clion+cmake+vcpkg的开发现代的c++跨平台程序_第1张图片

以上能够看出,除去调试是在windows上之外,其他的编译和调试,都不行在各个平台再进行一遍.实际开发过程当中,编译和调试通常只须要远端在linux下进行,win系统通常不须要任何改动.这完彻底全得益于cmake和vcpkg(真的是强烈推荐,能够说,若是没有vcpkg,我不会写这个东西).

啰嗦了这么多,如今终于要进入正文了.

环境搭配

Linux环境准备

准备一个linux操做环境,我准备是ubuntu18.04 .

在Ubuntu上安装git,cmake,gcc7.3.0.这三个网上的安装教程多如牛毛.这里就不复述了.如今我把我机器上的安装环境截图以下.

linux 编译 make vc,使用clion+cmake+vcpkg的开发现代的c++跨平台程序_第2张图片

安装vcpkg.

1. 创建一个目录/vcpkg

3. 进入目录/vcpkg,

4. 编译sudo bash ./ bootstrap-vcpkg.sh,会生成一个可执行文件vcpkg,不用安装到任何其余的位置,让它留在生成的地方就好.

5. 定义环境变量 VCPKG_ROOT="/vcpkg"

6. 安装gdb和ssh,这个是clion远程调试要使用的.

Windows环境准备

我使用的是 win10.安装了git,cmake,vs2019.

再安装vcpkg.定义一个环境变量VCPKG_ROOT="/vcpkg"

管理包

如今使用vcpkg安装一些必要的c++包.

好比,我安装了boost包.

vcpkg install boost

linux 编译 make vc,使用clion+cmake+vcpkg的开发现代的c++跨平台程序_第3张图片

查看一下.vcpkg list或者vcpkg list boost,部分截图以下

linux 编译 make vc,使用clion+cmake+vcpkg的开发现代的c++跨平台程序_第4张图片

linux 编译 make vc,使用clion+cmake+vcpkg的开发现代的c++跨平台程序_第5张图片

我只是为了嘚瑟一下而已,列表是在太长了.嘚瑟是程序员的必要需求.

Vcpkg的基本文件结构

vcpkg会在VCPKG_ROOT所指向的目录底下存储全部的包,

linux示意以下.

linux 编译 make vc,使用clion+cmake+vcpkg的开发现代的c++跨平台程序_第6张图片

Windows示意以下

linux 编译 make vc,使用clion+cmake+vcpkg的开发现代的c++跨平台程序_第7张图片

vcpkg主要使用的命令就是

vcpkg search xxxx ##搜索一个特定的c++库

vcpkg list xxxx ##显示已经安装的c++库.

vcpkg install xxxx ##安装一个特定的库

若是某个库文件有,而vcpkg没有收录.能够去研究一下ports/ 目录底下的各个文件夹.里面的文件指示vcpkg应该如何搜索特定的包.若是查看大部分portfile.cmake文件,就发现,vcpkg大部分库来自于github.这里只是提提,就不展开了.你们本身研究.

与Clion互动

安装clion,我这里使用的是2019.1.3版本.安装就不复述了.废话一句就是,有钱捧钱场,没钱的捧人场.

咱们使用vcpkg安装好了各类库,目的是为了方便的使用,让vcpkg帮咱们管理各类各样的头文件啥的.咱们只须要放肆的编写bug,嗯…咱们只须要专一于实现业务逻辑.这一切有一个统一的界面呈现给咱们,这个界面就是clion.

若是要添加一个新的库文件通常就是以下流程

vcpkg install xxxx ----àclion更新cmake-à放肆的使用新安装的库.-à编译-à调试.

以上各个步骤,第一步须要手动输入一个指令外,第二步须要更改一点cmake文件.除去以上步骤之外,剩余的全部步骤都不须要手动干预.这在vcpkg出现以前是不敢想象的.以前光引入头文件就劝退了多少人呀.若是再加上编译,链接库文件等等动做…c++又名c艹是很是有道理的.

如今第一步手动输入指令与第二步更改cmake文件,应该都不算是负担了,若是还以为是负担,能够说只能等AI自动编程来拯救了.(我用脸滚了一夜键盘,编写处理新一代操做系统windoors,不是梦).

下面经过一个简单的项目把项目创建到调试,再过具体一点.

Hello world

如今的主角就要转向clion了.我打算创建一个简单的c++程序,这个程序能够在linux上编译调试,同时也能够在win上编译调试.

我使用clion创建了一个新项目,截图以下

linux 编译 make vc,使用clion+cmake+vcpkg的开发现代的c++跨平台程序_第8张图片

如下,是个人编译工具链的设置.找到菜单 File->Settings->Build,Execution->Toolchains.截图以下

linux 编译 make vc,使用clion+cmake+vcpkg的开发现代的c++跨平台程序_第9张图片

找到File->Settings-> Build,Execution->Deployment.配置一个远程linux主机.截图以下

linux 编译 make vc,使用clion+cmake+vcpkg的开发现代的c++跨平台程序_第10张图片

由于要远程编译,必然的要把本地的源代码传送到远端linux里去.这里就是指示clion如何对应本地项目目录和远端目录的.其中Mapping指定了如何对应.你们能够根据本身的须要设置.下图我设置成立项目根目录对应着/root/clionproject/test/.

linux 编译 make vc,使用clion+cmake+vcpkg的开发现代的c++跨平台程序_第11张图片

更改以上两个,下面要配置clion当中的cmake了.这里才是真正使得clion和vcpkg互动起来.找到File->Settings-> Build,Execution->CMake,在ToolChain选择咱们刚刚设置的工具链之一.

linux 编译 make vc,使用clion+cmake+vcpkg的开发现代的c++跨平台程序_第12张图片

其中CMake options要填入:

-DCMAKE_TOOLCHAIN_FILE=/vcpkg/scripts/buildsystems/vcpkg.cmake

这样vcpkg就能够和clion互动起来了.clion使用vcpkg.cmake文件,此文件会指导cmake来寻找vcpkg管理的各类库文件,并指导clion使用它们.

依照一样的方式创造一下配置,使得clion也能够在vs下编译此程序.

linux 编译 make vc,使用clion+cmake+vcpkg的开发现代的c++跨平台程序_第13张图片

下面我编写一个简单的hellow world程序,此程序使用boost,编写一次,分别在linux和windows下编译(一次编写,到处编译),并打印出此时的操做系统类型.

1. 在Clion中建立一个新的项目:略

2. 添加Boost库到项目中

使用以上配置使得条件boost库变的简单.

在CMakeLists.txt中编辑以下内容

linux 编译 make vc,使用clion+cmake+vcpkg的开发现代的c++跨平台程序_第14张图片

3. 添加业务逻辑

里面有两个文件main.cpp.

linux 编译 make vc,使用clion+cmake+vcpkg的开发现代的c++跨平台程序_第15张图片

OperationSystem.hpp

linux 编译 make vc,使用clion+cmake+vcpkg的开发现代的c++跨平台程序_第16张图片

逻辑都超级简单,就不复述了.

4. 最后编译.只须要选择配置,而后点击编译就能够了.截图以下

linux 编译 make vc,使用clion+cmake+vcpkg的开发现代的c++跨平台程序_第17张图片

以上截图是linux,windows也是同样的.就不截图了.

一次编辑,到处编译

考虑以上过程,若是一套代码你再一台机器编辑好.好比在windows编辑好.而后复制到linux底下编译一下,有没有须要更改的地方?从如下几个方面检查一下

Cmake:一套配置文件在linux和windows底下是相同的,不用更改.

依赖库:都统一使用vcpkg管理依赖库.在linux和windows下是相同的,也不用更改.

项目代码:也不用更改.

编译命令:都是cmake自动操做的.也是同样的.

发现:基本上作到了一次编辑,到处编译.因为c++历史的缘由,想要彻底作到此特色,也着实难办.对于一些特殊的需求,特别是硬件需求,低层需求,仍是要使用预编译符号或者cmake来针对不一样操做系统,区别对待.虽然不能不能作到如netcore同样真正一次编辑到处编译.毕竟那是有大厂支持的.能够说,经过以上的介绍,基本上实现了”一次编辑,到处编译”.一套代码中只有很是少许的几行代码须要针对操做系统特殊处理.

另外一个由”到处编译”带来的好处就是能够自动打包.经过git上传代码至代码库,而后在目标机器中使用自动打包工具自动编译.

C++工具

格式化工具

Clion内置了一个clang格式化工具.可使用它来格式化本身的代码.这个很少赘述了.

内存泄漏

不少语言都内置了自动垃圾回收所谓GC,好比net,go等.可是有不少时候,因为设备或者效率的要求,使得运行环境不适合GC.可是内存回收依然十分的重要.而C++的内存泄露却老是使得各位码农花费不少时间去避免.如剃刀通常剃光了不少人的头发.

C++发展了不少工具,来避免内存泄露,如智能指针.可是因为库或者历史的缘由,使得智能指针不能覆盖所有代码.如今有工具来解决这个问题了.有时候,我老是以为,造东西不怕,我是怕出问题了殊不知道在哪(因此测试很重要).谷歌出了一套工具能够侦测内存泄露.名字叫作sanitizers.

下面我先截图一下,看看若是发生了内存泄露大约给出一个什么样子的提示:

linux 编译 make vc,使用clion+cmake+vcpkg的开发现代的c++跨平台程序_第18张图片

在上图中能够发现,在程序退出的时候,它打印了一些信息,明确的指出哪里(具体到了行)泄露了,泄露了多少字节.因为GCC内置了这个sanitizers.因此这里我直接使用了GCC内置的sanitizers.

下面我将使用此sanitizers.

程序很简单,我改造main.cpp,截图以下

linux 编译 make vc,使用clion+cmake+vcpkg的开发现代的c++跨平台程序_第19张图片

上段申请了一段内存并无释放.

在cmake文件中添加如下一句

SET(CMAKE_CXX_FLAGS"-fsanitize=address")

它目的就是告诉编译器,增长一个flag sanitize=address .

如今我在linux环境中编译运行,获得以下截图.

linux 编译 make vc,使用clion+cmake+vcpkg的开发现代的c++跨平台程序_第20张图片

但是问题来了.若是一样的代码在windows底下运行,就会得到以下错误.

1cc1e3a60dac5d5d1bf567ce933d67bb.png

好在内存泄露的检查只须要一次就好.因此我通常就修改cmake,使得它只会在gcc编译器下使用sanitize.而在msvc下就不使用此flag.不要乱立flag.

同时,若是使用 clang-cl来替代cl.也可使用sanitize,可是有某些功能上的限制.若是详细查看微软的文章,就会发现,其实微软的CRT内存泄露侦测,更灵活全面.功能更强大.

以上代码都是简单的演示,代码逻辑很是简单.源码我就不上了.有心实验者按照图片本身稍微敲敲吧.

谷歌的sanitize还有一个ThreadSanitizer,专门用来检测资源竞争和死锁的.使用也是同样的.

你可能感兴趣的:(linux,编译,make,vc)