可以看到中文输出变成了乱码,我们输入一些信息进去,这是运行结果:
可以看到,程序内写入的中文发生了乱码,而我们的输入没有。原因很简单,输入时实在linux的控制台环境下,编码默认是utf8的,所以我们的输入被正确编码,而源文件中的内容是GB18030的,所以在Linux控制台(默认以utf8解码数据并显示)中会发生乱码。
错误的原因知道了解决起来也就很简单了,把源文件的编码改成utf8就行,我们选择最简单的方法,在高级保存选项中修改编码(这个菜单选项默认被隐藏,网上有很多介绍如何显示它的方法的资料):
设置好后保存文件,现在文件的编码已经被改为了utf8了。
现在运行修改后的程序:
运行结果也是正常的:
使用数学函数和第三方库在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,这是设置:
下面是完整的代码:
#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"; }点击运行按钮,程序就能正常调试了,否则会报错: