代码文件在linux和win之间复制时的注意事项

文章讲述了在Linux和Windows系统之间进行软件开发时遇到的文件系统差异,包括目录结构、驱动设备表示、文件类型、文件命名规则以及文件内容的编码格式和换行符差异。重点讨论了解决文件复制后编译错误的方法,如处理文件命名的大小写敏感性、特殊字符限制,以及转换文件的换行符和编码格式。
摘要由CSDN通过智能技术生成

目录

文章目录

前言

1,目录结构

2,驱动设备

3,文件类型

4,文件命名

二、文件内容上的差异

1,文件编码格式

2,换行符或退格符导致出错



前言

在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常见设备文件名
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系统上,编译代码都是没有问题的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值