【问题标题】:Compilinig error on WSL when I try to compile a C sourcefile with command line parameters当我尝试使用命令行参数编译 C 源文件时,WSL 上的编译错误
【发布时间】:2017-08-06 07:57:06
【问题描述】:

编译下面的C代码时编译失败,抛出杂散字符错误:

#include "stdio.h"  
int main(int argc, char *argv[]) {
     int count;  
     printf("The command line has %d arguments:\n", argc - 1);  
     for(count = 1; count < argc; count++) {  
       printf("%d: %s\n", count, argv[count]);  
      }  
      printf("\n");  
 
      return 0;  
}

编译器:gcc 5.4.0 20160609 Ubuntu 16.04.3

错误截图:here

顺便说一句,其他C文件(如“hello world”)也可以编译成功。

【问题讨论】:

  • 您的代码没有错误。您在 wsl 上看到什么错误? (假设 Ubuntu 默认安装)您使用的是 gcc -Wall -Wextra -O3 -std=gnu11 -o nameforexe nameofsource.c 之类的东西吗?标准a.out 的最小编译为gcc -Wall -Wextra filename.c
  • 根据链接中显示的错误,您的程序文件中似乎包含非 ASCII 字节(似乎某些空白字符不是 ASCII 空格或制表符)。使用程序员的文本编辑器来构建您的源文件 - 不要使用像 Microsoft Word 这样的文字处理器。

标签: c windows-subsystem-for-linux


【解决方案1】:

继续我的评论,“您的代码中没有错误”,因此您收到的任何错误都是由于您的编译字符串是由于您有在已损坏 WSL 中的文件的 Windows 编辑器中编辑该文件。

要将您的代码(没有警告或错误)编译为默认的a.out 可执行文件,您可以使用一个简单的命令行:

gcc -Wall -Wextra yourfilename.c

注意:始终编译时启用警告,至少-Wall -Wextra。您可以添加更多单独的警告选项,也可以添加-pedantic,这将启用更多。

如果您想添加一些额外的选项、优化级别和 C 标准进行编译,以及为您的可执行文件提供自定义名称而不是默认的 a.out,您可以使用:

gcc -Wall -Wextra -pedantic -std=gnu11 -O3 -o yourexename yourfilename.c

通过编辑您的问题并将您收到的错误的确切文本添加到您的问题中,尝试并报告您收到的确切错误(如果有)。

如果您还有其他问题,请告诉我。

【讨论】:

  • 感谢您的帮助!我很抱歉我的问题不清楚或不准确。事实上,我真的用notepad++编辑了我的代码,我把我的代码和我在Windows中编译的其他代码一起放在了其他磁盘中,以方便排列它们。今天我用vim写了一遍,效果很好。
  • 您能具体解释一下吗?如果您能提供帮助或提供一些建议,我将不胜感激!
  • WSL 文件使用 Linux 文件权限存储(例如 drwxrwxrwx)。您可以通过 %AppData%\Local\lxss\... 从 Windows 访问 WSL 文件如果您使用通过 ...\lxss\... 的路径使用 notepad++ 编辑了文件,然后单击“保存”,则您已经损坏了 WSL 中的该文件,因为从 Windows 保存不会保留“ Linux 文件权限”信息。您可以通过 ...\lxss\... 从 WSL 复制到 c:\users\you\documents 并使用记事本++ 进行编辑,但您必须从 WSL 中复制回来,例如cp /mnt/c/users/you/documents/file.c file.c 保留烫发。
  • 您的错误屏幕截图显示您的文件中很可能包含 Windows UTF-16 字符。 Linux 使用 UTF-8。使用正确的字符集保存文件,它会编译得很好(只要你不丢失 Linux 文件权限)。同样对于在 WSL 中进行编辑,安装 vim (sudo apt-get install vim) 并花费 30 分钟来移动和编辑(i 进入 插入模式[esc] 到返回命令模式),您再也不用担心文件系统问题:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-02
  • 2016-08-31
  • 2017-01-20
  • 2021-11-20
  • 1970-01-01
  • 2015-01-12
  • 2020-02-16
相关资源
最近更新 更多