프로그램 C ++ 크로스 플랫폼 개발을 사용하여

프로그램 C ++ 크로스 플랫폼 개발을 사용하여

배경

개발 과정에서 일반적으로 고통스러운, 장황한 긴 개발 시간으로 간주 개발 언어로 사용 C는 ++. 최근 몇 년 동안 다양한 언어가 널리 상대적으로 C보다 말하기, 사용이 있습니다 ++ 색상에서 그렇지 않다. 나이하지만 C ++의 개발을 촉진하기 위해, 그는 자신이 최근 몇 년 동안의 급격한 변화가 있던, 아직 서 있지 않습니다가, 많은 도구의 출현이. 내가 뭔가를 작성하는 것, 자신의 업무 경험을 결합하지만 C ++, 알려주십시오.

C ++은 초기에 진짜 문제를 해결 태어 났지만, 시간이 C을 변경하면 ++ 새로운 상황을 발생했습니다.

첫 번째는 받는다는가 나타날 때, 매우 어렵 종속성의 관리에 개발을 주도, C ++는, 제약 거기에없는 패키지 의존성 관리하고 때로는 엉망이 .c ++ 상황, 이전 nuget 같은 비트 표시 C #을 말할 수있다 Microsoft는 vcpkg를 시작 해결 된 자바 전에하지만 지금은이 도구가 문제를 완전히 해결 물론, C ++ 패키지 관리를위한 다른 도구 I는 다음과 같은 이유로 vcpkg 추천 여기에 있습니다 : ... (1) 그것은 현대 C ++ 개발 프로세스 0.2과 일치한다. 정말 패키지와 패키지 종속성 및 헤더 파일 0.3의 좋은 관리입니다.이 동일 각 플랫폼에 대한 운영의 개발 모드 중. 사용이 편리합니다.

둘째, 프로젝트가 조직되었다, C ++ 음에이 제약이없는 미래의 상황을 고려하지 않는 시간이 내가 여기에 cmake 스크립트를 선택합니다 ... 전 C를 쓰고 ++ 코드, B를 : 특정 작업을? A : 당신은 조각이지만 .... 코드를 C ++ 코드를 작성하고 코드를 C ++ 파일을 작성하는 C ++ 코드를 작성 특히 참조하지만 cmake는 현재의 표준 C ++ 개발로 간주되는 코드 C ++ 파일입니다?

개발 도구 다시, 많은 선택이 어디에 대와 vscode 및 clion. 내가 clion를 선택했다.

이 크로스 플랫폼 개발 프로그램이기 때문에 마지막으로, 운영 시스템의 개발, 개발 플랫폼도 나를 선택해야합니다, 나는 win10로 선택했다. 리눅스 데스크톱이 선택되어 있지 않습니다. 그 이유는 너무 많은, 윈도우 도구 간단하다. 내가 지금 나이가되었습니다 great.'Ve입니다 자기 힘 그리드의 무대를 반영하기 위해 운영 체제를 사용할 필요 후. 내가. 내가 지금 필요한 인생의 시간이다. 시스템이 좋거나 나쁘다는 주장 의도가 없다 (하지만 대부분의 농부들은 코드가 시간 부족, 사실, 주된 이유는 작업 교환입니다 승리 시스템)를 사용하여 완벽하게 승리를 마이그레이션 할 수 있습니다, 이러한 도구는 크로스 플랫폼 말할 또는 리눅스는 어떤 변화를 가져 오지 않는 진짜 완전 원활한 동작 모드를 데스크탑.

이 논문의 결론 clion의 +의 cmake + 현대 C ++ 크로스 플랫폼 프로그램의 vcpkg 개발을 사용하는 것입니다.

프로젝트의 기본 조직

이 프로젝트는 win10로 작성, 나는. 문제가 자리하고있는 곳 나도 몰라, 난 그냥 두려워 문제가있어, 뭔가를 쓰기 두려워하지 않는 그래서 컴파일 및 디버깅도 매우 중요한 위치를 차지, 그것은 원격으로 운영하고 있습니다.

ㄱ 도면을 그리는 경우에는 다음과 같이 그 표현 될 수있다.

clip_image002 [9]

위에서 볼 수 있듯이, 컴파일러와 디버거의 나머지 부분은 다음 행이 각 플랫폼에 다시. 실제 개발 과정, 컴파일하지 않고 디버그는 일반적으로 단지 리눅스의 말단부에 있어야합니다, 시스템은 일반적으로하지 않습니다 승리, 디버그 창에서 제거 변경의 필요성이.이 (정말 매우 더 vcpkg가없는 경우, 나는이 물건을 쓸 수없는, 우리가 말할 수있는, 권장) cmake와 vcpkg 완전히 때문이다.

너무 장황한, 이제 마지막으로 몸을 입력 할 수 있습니다.

와 환경

리눅스 환경 준비를

리눅스 운영 환경을 준비, 나는 ubuntu18.04 될 것입니다.

우분투 자식에 설치, cmake, gcc7.3.0.이 세 가지 온라인 설치 튜토리얼 한푼이 다스. 여기를 반복하지 않는 것입니다. 지금은 아래의 내 컴퓨터 환경의 스크린 샷에 설치되어 있어야합니다.

clip_image004 [10]

설치 vcpkg.

1. 디렉토리 / vcpkg 만들기

2. 입력 명령 복제 힘내 HTTPS가 : //github.com/microsoft/vcpkg

3. 디렉토리 / vcpkg로 이동,

다른 위치에 설치하지 마십시오 sudo는 강타가 ./ bootstrap-vcpkg.sh는, 실행 파일 vcpkg을 생성 4. 컴파일, 그것은 장소에 머물 정도로 발생.

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 문서, 당신은 찾을 경우, 사실 경우, 마이크로 소프트의 CRT 메모리 누수 탐지,보다 유연하고 포괄적 인. 기능 더 강력한.

위의 코드는 간단한 데모 코드 로직은 매우 간단하다. 나는 소스에 아닙니다. 실험자는 조금을 노크 자신의 사진을 따르도록 결정했다.

구글은 또한 자원 경합 및 교착 상태를 감지하도록 설계된 ThreadSanitizer을 소독한다. 사용은 동일합니다.

추천

출처www.cnblogs.com/gaopang/p/11243367.html