プログラムC ++クロスプラットフォーム開発を使用します

プログラムC ++クロスプラットフォーム開発を使用します

背景

開発中は、一般的に痛みを伴う、長ったらしい、長い開発期間と見なさ開発言語として使用するC ++の。近年、さまざまな言語が広く、比較的Cより言えば、使用されているがあります++の色のうち、そうではありません。古いが、C ++の開発を容易にするために、彼自身が近年の急激な変化があった、まだ立っていないが、ツールの多くの出現は。私が何かを書くつもり、彼らの仕事の経験を組み合わせても、C ++、教えてください。

C ++は、早期に非常に現実的な問題を解決するために生まれたが、回をcを変更するよう++新しい状況に遭遇しました。

最初はそれに制約を持っていない、それはときには、非常に困難な依存関係の管理の発展につながった、と時々混乱.C ++状況であると言うことができる、C ++、パッケージの依存関係の管理で、前のnugetのようなビットは、C#を表示され、Mavenは表示されますjavaの前に今マイクロソフトでは、このツールは、問題を完全に解決し、もちろん、C ++パッケージ管理のために、他のツールがここにありますが、私は次のような理由vcpkgをお勧めしますvcpkgを立ち上げ解決されています.... 1それはそれが本当にパッケージやパッケージの依存関係の良い管理です。近代的なC ++開発プロセス0.2に沿ったものである、とヘッダファイル0.3。使いやすいです。運転の開発モード時の各プラットフォームで同じです。

第二に、プロジェクトが組織された、C ++はまあ上でこの制約を持っていない、将来の状況を考慮していない時間は、私がここにcmakeのスクリプトを選択します...私は、cを書いてい++コード、Bを:特定のジョブを? A:あなたは作品が....コードc ++コードを記述し、コードC ++ファイルを書き込むためにC ++コードを書くことを特に指すが、cmakeのは、今の標準C ++開発とみなされているコードのC ++ファイルです?。

開発ツールは、再び、多くの選択肢があるところで対とvscode、およびclion。私はclionを選びました。

最後に、オペレーティングシステムの開発、それはクロスプラットフォームの開発プログラムであるため、開発プラットフォームはまた、私はwin10に選んだ、私を選択する必要があります。Linuxデスクトップが選択されていない。理由は、あまりにも単純で、窓ツールです。私は今、時代はgreat.'Veされていています自己力グリッドの段階を反映するために、オペレーティング・システムを使用する必要が後に。私はつもりはありませんシステムが良いか悪いかであると主張している。私は今、必要な人生の時間です。(しかし、ほとんどの農家は、コードが不足している時間が、実際には、主な理由は、仕事の交換でありますこれらのツールは、クロスプラットフォームであると言う)勝利システムを使用して、シームレスに勝つまたはLinuxへ移行することができ、シームレスな動作モードが変更をもたらすものではありません本当の完全にデスクトップ。

この論文の結論では近代的なC ++クロスプラットフォームプログラムのclion + cmakeの+ vcpkg開発を使用することです。

プロジェクトの基本的な組織

プロジェクトはwin10で書かれて、私は。どこに問題がある、私は知らないが、私は恐れて問題だ、何かを書くことを恐れていないので、コンパイルやデバッグも非常に重要な位置を占め、それが遠隔操作されます。

図を描く場合は、次のように、それは表現することができます。

clip_image002 [9]

上記の図から分かるように、コンパイラやデバッガの残りの部分は、その後、何の行は、各プラットフォームが再び。実際の開発プロセスは、コンパイルしないとデバッグは、一般的に唯一のLinuxの先端にする必要があり、システムが一般的ではないん勝つ、デバッグウィンドウで除去されますすべての変更の必要性。これはcmakeのとvcpkgに完全に起因している(実際には非常にお勧めします、我々は何vcpkgがない場合、私はこのようなものを書くことができない、と言うことができます)。

そんなに長いったらしい、そしてついに体を入力します。

と環境

Linuxの環境準備

Linuxオペレーティング環境を準備し、私はubuntu18.04するつもりです。

Ubuntuのgitの、cmakeの、gcc7.3.0。これら三つのオンラインインストールチュートリアル掃いて捨てるほどにインストールされている。ここではそれを繰り返すことではありません。今、私は以下の私のマシン環境のスクリーンショットにインストールされています。

clip_image004 [10]

インストールvcpkg。

1.ディレクトリ/ vcpkgを作成します。

2.入力コマンドクローンGitのHTTPSは://github.com/microsoft/vcpkg

3.ディレクトリ/ vcpkgに移動し、

4.実行可能ファイルvcpkgを生成し、sudoのbashの./ bootstrap-vcpkg.shをコンパイルし、他の場所にインストールしていない、それは場所に滞在するのに十分なを生成しました。

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

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

Windows环境准备

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

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

管理包

现在使用vcpkg安装一些必要的c++包.

比如,我安装了boost包.

vcpkg install boost

clip_image006 [9]

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

clip_image008 [9]

clip_image010 [9]

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

Vcpkg的基本文件结构

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

linux示意如下.

clip_image012 [9]

Windows示意如下

clip_image014 [9]

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建立了一个新项目,截图如下

clip_image016 [9]

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

clip_image018 [9]

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

clip_image020 [9]

因为要远程编译,必然的要把本地的源代码传送到远端linux里去.这里就是指示clion如何对应本地项目目录和远端目录的.其中Mapping指定了如何对应.大家可以根据自己的需要设置.下图我设置成立项目根目录对应着/root/clionproject/test/.

clip_image022 [9]

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

 clip_image024 [9]

其中CMake options要填入:

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

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

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

clip_image026 [9]

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

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

2. 添加Boost库到项目中

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

在CMakeLists.txt中编辑如下内容

clip_image028 [9]

3. 添加业务逻辑

里面有两个文件main.cpp.

clip_image030 [9]

OperationSystem.hpp

clip_image032 [9]

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

4. 最后编译.只需要选择配置,然后点击编译就可以了.截图如下

clip_image034 [10]

以上截图是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.

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

clip_image036 [9]

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

下面我将使用此sanitizers.

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

clip_image038 [9]

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

在cmake文件中添加以下一句

SET(CMAKE_CXX_FLAGS "-fsanitize=address")

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

现在我在linux环境中编译运行,得到如下截图.

clip_image040 [9]

可是问题来了.如果同样的代码在windows底下运行,就会获得如下错误.

clip_image042 [9]

幸いなことに、メモリリークが唯一だから私はそれが唯一のgccコンパイラの下でサニタイズを使用します。そして、MSVCでこのフラグを使用しないように、cmakeのを修正する傾向がある。ただ、一度チェックする必要があります。混乱フラグは立たないでください。

ロングポジションの終了前にプログラムがメモリリークを報告する際、MSVCこの記事をそこに参照することができます。Https://docs.microsoft.com/en-us/visualstudio/debugger/finding-memory-leaks-using- -CRTライブラリ?ビュー= VS-2019

一方、代わりに打ち鳴らす-CL CLを使用する場合は。また、サニタイズを使用することができますが、一部の機能に制限があります。詳細ビューMicrosoftの記事ならば、あなたは、実際には、より柔軟で包括的なMicrosoftのCRTのメモリリークの検出を、見つけます。機能より強力な。

上記のコードは、簡単なデモコードのロジックは非常に単純である。私はソースにしていない。実験者は、ほとんどがそれをノック自分の絵に従うことを決定しました。

Googleはまた、リソースの競合やデッドロックを検出するように設計さThreadSanitizerを、サニタイズされています。使用は同じです。

おすすめ

転載: www.cnblogs.com/gaopang/p/11243367.html