使用Visual Studio 2019进行Linux远程开发(3)

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

使用Visual Studio 2019进行Linux远程开发

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

现在运行修改后的程序:

使用Visual Studio 2019进行Linux远程开发

运行结果也是正常的:

使用Visual Studio 2019进行Linux远程开发

使用数学函数和第三方库

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

使用cpp时,libstdc++依赖于libm,所以使用g++编译你的程序时会自动链接数学函数库;

使用c时,如果是sqrt(4)这样的形式,较新的gcc提供了替换措施,不需要显示链接libm;

接上一条,如果你的参数是个变量,那么编译器可能会选择需要你链接libm。

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

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

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

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

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

使用Visual Studio 2019进行Linux远程开发

下面是完整的代码:

#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"; }

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

使用Visual Studio 2019进行Linux远程开发

linux

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/11684.html