cygwin下编译,调试C源程序

cygwin下编译,调试C源程序,第1张

你是初学者吧,没关系,很简单的。

cygwin我没用过,大概是别人给套了个可视化编程界面了。

1.你运行cygwin这个软件,然后“文件/打开/”把你准备好的C源代码加载到这个软件中闷掘。(就好比我们平时用word时,先运行word软件,然后把你的文档加如入并进行编辑。)

2.在软件界面上(一般在:工具栏)找一个功能为“运行”的按纽。

准备知识:

写一个程序一般分以下步骤:

1.编辑(就是把你的源代码写出来,你可以穗罩饥用“记事本”写,当然一般编程工具cygwin也会提供编辑环境)

2.编译+连接(你只要点个按纽就行,这个任务完全由cygwin完成,你不必管它怎么完成这个任务的。

==============================

那么,编译是什么意思呢?

==============

由于你是初学者,我只能用尽可能通俗的话给你解释一下,这种解释是不够准确的。因为计算机本身只认识二进制指令,就是0/1的序猜返列,每个0/1的序列都在计算机设计时,就赋予了一定的含义。比如:设计师可以把0001表示作个加法,用0000表示作个减法。但是如果人们用0/1的序列来表达我们的需求,显然非常麻烦。于是,后来一些科学家就发明了一种近似英语的计算机语言C,很明显如果要让计算机也明白C表达的意思,我们就必须把C翻译成0/1的序列。那么,编译就可以理解为“翻译”。

[打个比方1]这就好比,你是个中国人,你只会说中文,计算机是个美国人,它只会说英语。你要请计算机给你做件事,你可以用中文写好你的要求,然后请个翻译,把你的要求翻译成英语。)

======

调试是什么呢?

=====

调试分两个层面:(沿用上面的比方1)

1.语法层

你用中文表达你的要求时,可能你的用语不够规范,或写了错别字,使得你

请的翻译不理解你的意思,没办法翻译下去。这时,这个翻译就会通知你说:“对不起,你这个字是不是写错了”。于是,你就“调整调整,修改修改,才试一试”(“调试”由此得名),然后才请翻译进行翻译。

2.语意层

由于你的疏忽,你把要求表达错了。举个离谱点的例子:你本意是打算请计算机帮你买张去北京的火车票的,结果你不小心,写成了买张去上海的火车票。出现这个错误,翻译没方法告诉你,只有等计算机把一张上海的车票给你,你才意识到,于是你重新调试,才执行。

cygwin是linux仿真环境你在cygwin里面开发windows程序属于交叉编译cygwin调用了cygwin.dll库来支持linux下gcc的函数对windows的支持。如果不用哪春cygwin.dll,就应该在编译参数中加上 -mno-cygwin ,意思是使用mingw的库来编译。

由此产生的弊端是一些linux中的函数不被支持。

如果要单纯的移植,还是带cygwin.dll一起发布好一点。

但是这种方法也不能保证全部可移植。

C语言能不能移植,还与linux和windows中C库的实现不同有关。

最简单的例子,橘缓颂他们的基础数据类型的表示方法可能不同,在linux中用4个字节表示的,linux中说不定是8个字节。由此你函数的输出结果也就圆郑不同。

因此你要做的,就是一点点的翻看两个系统的定义,确保他们的实现一样、不会产生二意性。

另外库函数的返回也可能不一样,也必须排除不同的返回值。

[自己知岩租的程序无法显示UTF-8字符]

我用MinGW gcc 4.4.0编了个简单程序,printf char[]字符串到stdout,源代码用不带BOM的UTF-8保存,用WinHex查看编译后程序,里面的字符串也是UTF-8的,在cmd或Cygwin bash下运行,均按GBK解码字符,结果在ASCII之外的字符都是错误的。

[Cygwin中的程序能显示UTF-8字符]

但奇怪的是,我发现Cygwin自身的一些软件包都采用UTF-8的环境,比如:我的程序myapp.exe的UTF-8输出字符串本来是不能正确显示的,但如果将程序输出赋给环境变量:

VAR=`./myapp.exe`

然后:echo $VAR,这时就能在控制台显示正确的UTF-8字符串。

为了验证VAR确实保存UTF-8字符串,我echo $VAR >out.txt,检查out.txt也是UTF-8编码的。

另外:

echo "字符串" >out.txt,out.txt也是UTF-8编码的。

cat out.txt,当out.txt为GBK时不能正确显示;当out.txt为UTF-8时可以正确显示,并且cat out.txt >out2.txt,out2.txt也是UTF-8编码的。

[Linux下的UTF-8字符输出实验]

为了搞清楚,我将源程序文件原封不动的拷贝到Debian下,Linux gcc 4.3.0编译,用od查看编译后程序,里面的字符串也是UTF-8的。程序在gnome-terminal下的bash中执行,能够正确显示字符串。原先以为这是我将bash环境的LC_XXX设置为UTF-8的原因,但是我用export LANG="zh_CN.GBK"后,程序还是能正搭兆确显示字符串,最后发现是gnome-terminal的字符编码影响了程序输出字符串的显示:如果将gnome-terminal的字符编码设为GBK,就则会显示出错。

[怎样在Cygwin下显示UTF-8字符]

我在Cygwin bash下用export LANG="zh_CN.UTF-8",但还是无法正确显示自己程序输出的UTF-8字符,于是我想是不是显示字符串和bash的locale设定没关系,而和下层的控制台设备的活动字符编码有关。

对于显示UTF-8编码的字符串,大家有什么建议和方法呢?

为什么Cygwin自己的程序,例如:cat、echo,它们输出的UTF-8字符串就能正确显示呢?实际上Cygwin的cat在bash、cmd上都能正确显示UTF-8字符串。

P.S.

其实有一个不很好的办法,让bash、cmd显示UTF-8字符串:

先chcp.com 65001将控制台活动代码页改为UTF-8的,然后在枣猜控制台的属性->字体中选择合适的字体,就能显示UTF-8字符,但是可选的字体似乎只有一个:Lucida Console,用这个字体第一次显示输出的字符串时,字符串只显示半截,然后将控制台窗口遮蔽到其它窗口后,再d到最前时,整个字符串才显示出来,这个问题似乎和控制台呈现字体的图形 *** 作有关。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12510007.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-08-25
下一篇2025-08-25

发表评论

登录后才能评论

评论列表(0条)

    保存