Ubuntu 17.10下外接硬盘中C++程序运行报错问题咨询
问题排查与解决思路
Hey,这个问题我之前帮不少开发者排查过,看你描述的现象——编译成功但换外接硬盘就出shell语法错误,核心原因基本都和外接硬盘的文件系统兼容性或者挂载/路径问题有关,咱们一步步来拆解:
1. 非Linux原生文件系统的挂载权限限制
Ubuntu默认挂载NTFS/FAT32这类Windows常用文件系统时,会默认限制执行权限,或者存在文件属性异常的情况。虽然你能成功编译,但运行时系统可能无法完整读取可执行文件内容,或者调用shell解析时出现截断,就会抛出unexpected EOF while looking for matching ''这类错误。
解决步骤:
- 先确认外接硬盘的文件系统:打开终端输入
df -T,查看你外接硬盘对应的Type列(比如ntfs或vfat)。 - 如果是NTFS,重新挂载并赋予执行权限:
- 先卸载硬盘:
sudo umount /media/你的用户名/硬盘挂载名 - 重新挂载(替换成你的实际分区和路径):
sudo mount -t ntfs-3g /dev/sdXn /media/你的用户名/硬盘挂载名 -o uid=$UID,gid=$GID,exec
(可以用lsblk命令查看你的硬盘分区,比如/dev/sdb1)
- 先卸载硬盘:
2. 文件路径/名称包含特殊字符
如果你的外接硬盘挂载名(比如"My External Drive")或者程序所在路径里有空格、单引号、双引号这类特殊字符,shell在执行可执行文件时会把它们当成语法分隔符,导致解析中断,触发EOF错误。
解决步骤:
- 把外接硬盘的挂载名改成无特殊字符的(比如"MyExternalDrive"),或者把程序移到路径里没有空格/引号的文件夹下,再编译运行试试。
3. 换行符格式不兼容(Sublime Text 2保存问题)
虽然概率稍低,但Sublime Text2在外接非Linux文件系统上保存文件时,可能会默认用Windows的CRLF换行符,而Linux系统期望的是LF格式,这也可能导致运行时的解析错误。
解决步骤:
- 在Sublime Text2中打开你的C++程序,点击右下角的换行符标识(比如显示"Windows"),切换为"Unix",然后重新保存文件再编译运行。
- 也可以用终端命令转换:
dos2unix /path/to/your/program.cpp,之后重新编译。
4. 可执行文件写入不完整
外接硬盘的IO缓存或者文件系统兼容性问题,可能导致编译生成的可执行文件写入不完整,运行时就会出现“意外文件结束”的错误。
解决步骤:
- 把编译好的可执行文件复制到本地硬盘(比如
~/Desktop),如果能正常运行,就说明是外接硬盘的写入问题,建议重新挂载硬盘或者检查硬盘健康状态。
内容的提问来源于stack exchange,提问作者CodeCraft
相关产品推荐
相关产品推荐

