LinuxのLinuxのリモート開発リモート開発

Linuxのリモート開発

一般的に、我々はLinuxアプリケーションを開発する2つのオプションがあります。

  1. Linux上で書かれたプログラムを直接テストとデバッグを実行します
  2. リモートツールを使用して、WindowsまたはMac OS X上で開発

私が直接Linux環境で開発されたが、彼らは作業効率に影響を与える可能性がある奇妙な環境を残すためのシステムに精通している場合は、Windows環境で開発作業に従事している多くの人々がありますが。

だから、今日、私たちは、Linuxリモート開発し、どのように共通の落とし穴を回避するために、Windows上のVisual Studio 2019を使用する方法を見ていきます。

引用

クロスプラットフォームのVisual Studio開発入門

Visual Studioの2017年から始まって、Microsoftがクロスプラットフォーム開発機能を立ち上げ、あなたが対コードを編集することができます対、クロスプラットフォームのコンパイルおよびリモートデバッグに続いて、もともと私たちは手動で作業を完了する必要があり、自動化された、非常に私たちの負担を軽減。これは私たちが今日の主役に注力したいものであるAndroidとLinuxの、などのプラットフォームをサポートしていました。

あなたは不思議に思うかもしれません、対あなたがこの知識を理解していないにもかかわらず、リモートの開発であるが開発することができますが、私は簡単な説明をするために2分を費やすしたいと思います。

対リモート開発は、2つのステップに分かれています。

  1. リモート環境への接続を作成し、(また、ヘッダファイルの他の部分を指定することができ、後で説明します)ローカルに同期リモート環境VSシステムヘッダファイルを聞かせて、C ++コード補完は、最初のファイルのみが必要です。
  2. コードは、適切なリモート環境を選択し、書かれた、対指定された場所のリモート環境にコードとオブジェクトファイルをコピーして、ご使用の構成に応じてコンパイルされるとき。
  3. その後VSは、デバッガがもたらす対あなたが完全に効率性と利便性を享受することができ、その間、GDBコンソールやgdbserverをして​​、あなたのプログラムを実行します。

上記の手順の後には、内部の対で書かれた、独自のクロスプラットフォームのプログラムをデバッグすることができます。

Linuxのリモート開発は、vs2019を使用して行います

はじめにこの終わりに、のグラフィックのチュートリアルを見てみましょうvs2019でのLinuxを開発しました。我々が開始する前に、すべてのポイントの最初の準備作業を行うには:

  1. vs2019をインストールし、Linuxの機能のためのC ++をチェックしてください。
  2. 静的IP Linux仮想マシンを構成として、使用可能なLinuxのリモート環境を準備し、GCCツールチェーンとOpenSSHがインストールされています。

準備ができたら、私たちは、に行くべきです。

プロジェクトを作成します。

LinuxのLinuxの機能のためのC ++をインストールした後、私たちは、図示のように、パネルで新しいプロジェクトを作成するためのオプションが表示されます:

ここでは、あなたもここに脇に置く、cmakeのプロジェクトを作成する方法を見ることができ、その後の記事を構築空白のコンソールアプリケーションプログラムを解決するためのプロジェクト対伝統を使用することを選択しました。

ここでは何も言うこと、保管場所項目を選択し、ローカルの場所に注意を払っていない、バックでリモートマシンの位置が設定されます。

成功を作成する私たちのリモート開発プロジェクトを作成するときにクリックします。

リモートプロジェクトの設定

対コンフィギュレーション・スペース・プロジェクトを編集することはできませんので、我々はプロジェクトの最初を作成しmain.cpp、その後、上部のメニューをクリックしてください:プロジェクト- >プロパティは、プロジェクトの設定インターフェースを見ることができます:

リモートコンピュータは、リモートデバッグ接続マネージャが追加です。プロジェクトの種類を変更したり、収納位置の結果をコンパイルする必要がない限り、ここでは一般的に、変更は必要ありません。あなたが選択をすることができ、複数のリモート環境を持っている場合。

セクションには、デバッグを提供gdbし、gdbserver前者は対Linuxの設定のカラー出力の端子場合は、ここでGDBを実行し、出力を返すために、Linux上でコンソールを起動し、それらを知っていない対後悔させている、それはのように表示されます元の文字列; gdbserverをつぶやきはありません解決バックホールデータ対ローカル、リモートの使用gdbserverのを、可能になります。あなたはそれが不可能、その後のgdbプログラムと引き換えに、マイクロソフトの推奨を参照し、ポイントを破るために見つかった場合はここでは、gdbserverをを選択しています:

次の最初のヘッダファイルは、コードの自動補完やヒントに対これらのファイルを使用して、リモート設定環境を同期させる必要がある重要な構成は、次のとおりです。

デフォルトのパスは、通常、すでにLinux上のヘッダファイルのほとんどが含まれているコピー、我々は通常、変更する必要はありません。ヘッダファイルの同期は、プロジェクトの成功の後の最初の建物の後に発生するか、リモート接続を手動で同期を追加します。

そして、C / C ++コンパイラ、gccとgのように構成されている]を選択++これらのパラメータを説明するためのコンパイラ引数は我々の議論の範囲を超えて、我々は適切な++標準バージョンcを選択する必要があります。

这里我们选择了c++17。其他设置与在Windows上进行开发时一样,vs可以自动转换成g++的参数,这里就不再赘述。

添加远程环境

有了远程环境我们才能同步头文件或者进行调试运行。

在第一次编译或调试你的项目时vs会自动让你连接远程环境,当然,我们推荐在调试->选项->跨平台->连接管理器中进行设置:

填入你的远程ip/域名,端口ssh默认为22,安全起见你需要修改成其他端口,这里方便演示使用了默认配置,密码同上,你应该考虑使用更安全的ssh私钥登录。

登录成功后这个连接就添加完成了,我们看到管理器下面还有一个远程标头管理器的设置项,这就是用来同步头文件的:

点击更新按钮就会开始同步头文件,这些文件会被缓存在本地,因为要从远程一次性复制大量文件,所以可能会花费较长的时间。

这样远程环境就添加好了,可以开始写代码了。

本地编写和远程调试

至此你已经可以在vs中编写面向Linux平台的代码了,自动补全可以正常工作:

可以看到Linux中的头文件和结构体都已经可以识别了。如果你发现无法自动补全(通常发生在刚添加远程连接或是项目设置发生了变化后),先试试关闭vs重新打开,如果没用请尝试刷新intellisense或重新同步头文件。

在编辑结束后我们就能点击调试按钮运行我们的程序了:

注意,构建的体系架构必须是和远程环境一致的,比如远程环境是x64,这里可以选择x64或x86,但是不能选择arm,否则会报错。

这是测试代码,它将输出当前Linux系统内核的版本:

#include <sys/utsname.h>
#include <iostream> #include <cstdio> int main() { auto start = chrono::high_resolution_clock::now(); utsname names; if (uname(&names) != 0) { std::perror("cannot get unames"); } std::cout << "Linux kernel version: " << names.release << std::endl; }

点击调试->Linux 控制台,会显示一个可以交互的console,你可以在其中输入内容或是看到程序的输出:

程序运行成功。

避免踩坑

远程编译顺利完成后,我们就可以接着利用vs debugger设置断点,在断点处查看变量,甚至对运行中的Linux进行动态性能分析了。

不过在此之前,还有一些坑需要提前踩掉。

中文乱码

编码问题带来的麻烦永远会被放在第一位,毕竟当人们看到预想的输出实际上是一堆乱码时总会不可避免得紧张起来。

众所周知,编码问题一直是老大难,特别是Windows上中文环境通常是GB18030或GBK,而Linux上统一为utf8时。

下面看个实际例子,通常我们的程序里只包含ASCII字符的话不容易产生问题,所以我们加上一点中文字符:

#include <sys/utsname.h>
#include <iostream> #include <cstdio> #include <string> int main() { utsname names; if (uname(&names) != 0) { std::perror("cannot get unames"); } std::cout << "Linux kernel version: " << names.release << std::endl; std::cout << "输入内容:"; std::string input; std::cin >> input; std::cout << "你输入了:" << input << std::endl; }

对于上面的测试程序,我们添加了一点中文输出信息,现在打开控制台进行调试:

可以看到中文输出变成了乱码,我们输入一些信息进去,这是运行结果:

可以看到,程序内写入的中文发生了乱码,而我们的输入没有。原因很简单,输入时实在linux的控制台环境下,编码默认是utf8的,所以我们的输入被正确编码,而源文件中的内容是GB18030的,所以在Linux控制台(默认以utf8解码数据并显示)中会发生乱码。

错误的原因知道了解决起来也就很简单了,把源文件的编码改成utf8就行,我们选择最简单的方法,在高级保存选项中修改编码(这个菜单选项默认被隐藏,网上有很多介绍如何显示它的方法的资料):

设置好后保存文件,现在文件的编码已经被改为了utf8了。

现在运行修改后的程序:

运行结果也是正常的:

使用数学函数和第三方库

在Linux上使用标准库提供的数学函数也是一个老生常谈的问题,根据你使用cpp还是c会有如下几个情况:

  1. 使用cpp时,libstdc++依赖于libm,所以使用g++编译你的程序时会自动链接数学函数库;
  2. 使用c时,如果是sqrt(4)这样的形式,较新的gcc提供了替换措施,不需要显示链接libm;
  3. 接上一条,如果你的参数是个变量,那么编译器可能会选择需要你链接libm。

通常在Windows上我们无需操心这点,但在Linux上使用c语言时就很难忽略这个问题了。

因此保险起见,如果你正在编写一个使用了数学函数的c程序,那么总是指定连接libm是没错的。(具体可以参考这里

另外当你使用例如boost这类第三方库时,也需要注意。在Windows上我们通常指定好附加包含目录和附加库目录即可正常编译,但是Linux上必须明确指定链接库的名字,因此我们在项目属性中进行设置。

在Linux上我们可以使用pkg-config来减轻上述的重复劳动,而在vs中我们不能直接利用这一工具,当你的项目使用了大量第三方库时就会成为不小的麻烦,如果想要解决这一问题,可以参考后续文章里我会介绍的vs+cmake构建项目。

下面我们给例子加上一点boost chrono的功能测试,在Linux上需要指定-lboost_chrono,这是设置:

下面是完整的代码:

#include <sys/utsname.h>
#include <iostream> #include <cstdio> #include <string> #include <boost/chrono.hpp> int main() { namespace chrono = boost::chrono; auto start = chrono::high_resolution_clock::now(); utsname names; if (uname(&names) != 0) { std::perror("cannot get unames"); } std::cout << "Linux kernel version: " << names.release << std::endl; std::cout << "输入内容:"; std::string input; std::cin >> input; std::cout << "你输入了:" << input << std::endl; auto counter = chrono::duration_cast<chrono::milliseconds>(chrono::high_resolution_clock::now() - start); std::cout << "程序运行了:" << counter.count() << "ms\n"; }

点击运行按钮,程序就能正常调试了,否则会报错:

おすすめ

転載: www.cnblogs.com/Leo_wl/p/10994230.html