目录
前言
在linux系统上开发软件时,通常的做法是,在window系统中使用代码编辑工具编写好代码后,再复制到linux的交叉编译环境中进行编译;或者有时候从网上找到一些开源的代码,在window系统上使用编辑工具修改之后,再放到linux的交叉编译环境中进行编译。在这样操作的过程中,会经常遇到一些问题,如linux和window对文件命名规则的差异,导致文件复制出错。再或者代码文件在不同系统上编码格式的不同,而出现编译报错或代码乱码等。下面进行说明。
一、文件系统、文件命名等的差异
1,目录结构
1),斜杠和反斜杠:
在表示路径时,Windows 使用反斜杠“\”,而linux使用斜杠“/”。
2),驱动器:
在window上使用“D:\”表示驱动器。而在linux使用“/”表示根目录,linux的硬盘驱动器是挂载在某个目录上的。
2,驱动设备
在window使用一个名字来表示一些驱动设备,而在linux使用一个路径来表示。比如在window上表示驱动设备文件的名字有:aux、com1、com2、prn、con、nul等,这些名称不能用作文件名。
所有的硬件设备在linux下都会被识别为文件!一个设备对应一个设备文件!几乎所有的硬件设备文件都在/dev目录内, 通过ls -al命令可以看到诸如/dev/sda, /dev/sr0这样的设备文件名。
下面是常见的设备和文件名对照表:
linux常见设备文件名 | |
---|---|
设备 | 文件名 |
SCSI/SATA/USB接口硬盘驱动器或U盘 | /dev/sd[a-p] |
IDE接口硬盘驱动器(已逐步被SATA接口取代) | /dev/hd[a-d] |
虚拟机内的Virt I/O设备 | /dev/vd[a-p] |
软盘驱动器 | /dev/fd[0-7] |
打印机 | /dev/lp[0-2] (25针串口) /dev/usb/lp[0-15] (USB接口) |
鼠标 | /dev/input/mouse[0-15] (通用) /dev/psaux (PS/2接口) /dev/mouse (当前鼠标) |
CDROM/DVDROM | /dev/scd[0-1] (通用) /dev/sr[0-1] (通用,CentOS较常见) /dev/cdrom (当前CDROM) |
磁带机 | /dev/ht0 (IDE接口) /dev/st0 (SATA/SCSI接口) /dev/tape (当前磁带) |
3,文件类型
在linux系统上,有一个文件有文件类型的属性,可以通过ls -al命令进行查看。linux每种类型的文件由不同的符号来表示,下面是常见的几种符号的含义:
符号 | 文件类型 | 含义 |
- | 普通文件 | 大部分的文件类型 |
d | 文件夹 | |
l | 符号链接文件 | ln –s 源文件 链接文件可以产生该文件 |
c | 字符设备文件 | 如键盘和鼠标 |
b | 块设备和其他外围设备 | 如硬盘和内存 |
s | 套接字文件 | 即网络流 |
p | 管道文件 |
详细介绍如右:Linux的文件属性,Linux文件类型与属性
而在window系统上,没有该属性内容,window是通过文件的后缀名来区分不同的文件类型的,比如.txt文件、.doc文件等。
因此当linux上的文件复制到window时,linux的文件类型属性有丢失。会全部按普通文件或文件夹来处理。
除此之外,在linux上,一切都是以文件来表示的,这也是和window的差异。
4,文件命名
1),区分大小写:
在 Windows 上,同一个文件夹中不能有一个名为file 的文件和另一个名为FILE的文件。Windows 文件系统不区分大小写,因此它将这些名称视为同一个文件。
在 Linux 上,文件系统区分大小写。这意味着您可以在同一文件夹中拥有名为file、File和FILE的文件。每个文件都有不同的内容——Linux 将大写字母和小写字母视为不同的字符。
2),特殊字符:
linux系统中的文件命名的非法字符就只有文件路径中的斜线 / 。windows中的文件命名的非法字符有 / \ * ? < > | : " 。
另外,在linux和window中,空格都是可以作为文件命名中的字符的。不过在linux中包括空格的文件名,在表示该文件名时,需要用双引号""包括该文件名,或者在空格前使用转义字符\表示。使用起来比较麻烦,不建议在linux上使用空格字符对文件命名。除此之外,在linux上使用 \ " ' 等字符时,也会带来一些不便。
3),其它情况:
a),隐藏文件:
在linux中以点号为开头的是隐藏文件,只要是以点号开头的文件就不能手动创建,创建之后也会被删除.(如果是****... 点在后面的可以正常创建.)
在window中,在创建文件夹的时候不能以点号"."开头(但是文件以多个点开头并且还有其他合法字符的话就是合法的)。但是在windows系统中确实见过以一些以点号"."开头的文件夹,创建这种文件夹,不能手动的创建,可以用代码来创建,或者通过命令行的方式创建.。这些以点号开头的文件夹是有特殊用途的,用户一般不使用点号开头命名文件夹。
b),其它方式
在linux中可以以点号当作文件或文件夹名字的最后一个字符来命名,但是window中不用过这么做。在window系统中命名一个文件时,当文件名中不包括”点号 + 若干个字母“后缀时,系统会把该文件当作一个二进制文件来处理,当文件名结尾处只有一个点号时,window系统会认为文件名结尾处缺少字母,会报错。
二、文件内容上的差异
1,文件编码格式
linux使用的是UTF-8的格式;windows会用的是GBK的格式,需要将GBK转到UTF-8(但是此时可能会出现中文乱码),转码成UTF-8后在linux上编译就不会出现报错了。
所以在window上使用的编译工具,要修改工具的设置,默认使用UTF-8的编码格式。
当然如果是在window上编译代码的话,要默认使用GBK的编码格式。
2,换行符或退格符导致出错
开发人员经常会遇到多平台的开发,比如最常见的是在linux与windows之间的开发。常常为了便利,我们会之间将linux的文件拷贝到windows上的工程上来编译,但是这会出现错误:
明明已经定义了的变量,编译时却提示: C2065“xxxx”: 未声明的标识符
这主要是因为linux与windows下文件换行符不一样导致的。linux文件的换行符是\n字符,而windows文件的换行符是\r\n两个字符。因此,如果我们将一个多行文件,从linux操作系统中传输到windows操作系统时,经常多行文件会变成一行,如下图:
这就是结束符\n导致的,可以用如notepad++这类的软件打开,“视图->显示符号->显示所有符号”,然后可以看到所有的回车换行都是linux的LF:
因此我们需要将linux下的LF转为windows的CRLF类型,可以使用其他dos2unix等工具,当然,也可以使用notepad++进行转换:“编辑->档案格式转换->转换为windows格式”:
修改过后如下图,这种CRLF文件结束符才是windows的。
当然window系统上编辑的文件复制到linux上编译时,也是会有同样的问题,使用上述类似的操作转换换行符即可。
除了换行符外,退格符(tab符)也有类似的问题,可以使用notepad++工具将tab符转换成空格符,如果是使用source insight编辑工具的话,也可以设置将tab符直接保存为空格符。tab符转换成空格符之后,无论是在window还是linux系统上,编译代码都是没有问题的。