2017-08-13 191 views
2

我的操作系统的源到目标文件是Windows 10,我用命令提示符这段时间进行编译。编译使用gcc -c * .c的

根据,我读的书,编译所有的源文件,并使它成为一个目标文件,(在当前目录中)做到这一点通过键入以下命令:

gcc -c *.c 

它说的操作系统将会取代的* .c与所有的C文件名

但为什么我收到此错误?

gcc: error: *.c: Invalid argument 
gcc: fatal error: no input files 
compilation terminated. 

我在正确的目录中。 而当我编译我的源文件与他们各自的名称,它的工作正常。但'* .c'不起作用。

而且在使用“*的.o”

是该命令不适用于Windows操作系统链接的目标文件同样的错误?如果不是,窗户是什么?

新手在这里。

+3

跨网络的重复[这里](https://superuser.com/questions/460598/is-there-any-way-to-get-the-windows-cmd-shell-to-expand-wildcard-paths) 。我建议你安装一个unix shell模拟器并避免使用windows命令提示符。 Cygwin就是这样一个可能的模拟器。 – StoryTeller

+0

您确定在当前工作目录中至少有一个'.c'文件吗?否则'* .c'将不会被扩展,因此'gcc'会收到单个命令行参数'* .c'。 –

+0

@GrzegorzSzpetkowski。是的先生。我在正确的目录中。 – Bicolano

回答

0

在Windows中,通配符是而不是支持,因此您看到的错误。

在UNIX虽然,你用什么,会是正确的:

Georgioss-MacBook-Pro:~ gsamaras$ nano main.c 
Georgioss-MacBook-Pro:~ gsamaras$ nano fun.h 
Georgioss-MacBook-Pro:~ gsamaras$ nano fun.c 
Georgioss-MacBook-Pro:~ gsamaras$ gcc -c *.c 
Georgioss-MacBook-Pro:~ gsamaras$ 
+1

嗯,Mingw与我合作很好 – meowgoesthedog

+1

Mingw在内部管理它。在linux中我认为它是依赖于shell的 –

+0

你最好把你的答案说清楚***在Windows CMD ***中。像Cygwin这样的仿真Unix环境仍然处理CLI程序的通配符。 – iBug

6

在Unix系统和环境(如MSYS或Cygwin的),通配符由shell(取决于)在Windows CMD扩大,但,通配符将被收到的程序扩展和解释。这听起来很奇怪,但cmd.exe不支持通配符扩展(当翻译),但它的一些内置的命令去做,像COPY

使用一个简单的程序来验证它。在Unix

#include <stdio.h> 
int main(int argc, char *argv[]){ 
    int i; 
    for (i = 1; i < argc; i ++) 
     printf("%s\n", argv[i]); 
    return 0; 
} 

输出示例:在Windows

$ ./a.out /* 
/bin 
/boot 
/dev 
... 
/usr 
/var 
$ ./a.out /\* 
/* 
$ 

输出示例:

C:\Windows\system32>a.exe C:\* 
C:\* 
C:\Windows\system32> 

如果你不想让别的扩大你的程序的通配符,使用MinGW(MSYS)或Windows Subsystem for Linux(Win 10 1607及更高版本)。