使用gcc -c *.c将源代码编译成目标文件。

4

我的操作系统是Windows 10。这次我使用命令提示符进行编译。

根据我正在阅读的书籍,要将所有源文件编译为目标文件(在当前目录中),请键入以下命令:

gcc -c *.c

这里说操作系统将使用所有C文件名替换*.c

但是为什么我会收到这个错误?

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

我在正确的目录中。 使用各自的名称编译源文件时,它可以正常工作。但是 '*.c' 不起作用。

连接对象文件时出现相同的错误,使用 '*.o'

该命令不适用于 Windows 操作系统吗?如果不是,请问 Windows 上有哪个命令?

新手请教。


3
跨网络重复此处。我建议您安装Unix Shell模拟器,避免使用Windows命令提示符。Cygwin是其中一个可能的模拟器。 - StoryTeller - Unslander Monica
你确定当前工作目录中至少有一个 .c 文件吗?否则 *.c 将不会被扩展,因此 gcc 只会接收到单个命令行参数 *.c - Grzegorz Szpetkowski
@GrzegorzSzpetkowski。是的,先生。我在正确的目录中。 - Bicolano
@StoryTeller.. 谢谢您先生。我会阅读它。 - Bicolano
2个回答

7
在Unix系统和环境(如MSYS或Cygwin)中,通配符是由shell(取决于哪个shell)扩展的,但在Windows CMD中,通配符是由接收程序扩展和解释的。这听起来很奇怪,但cmd.exe不支持通配符扩展(作为解释器),但它的一些内置命令支持,比如COPY。使用一个简单的程序来验证它。
#include <stdio.h>
int main(int argc, char *argv[]){
    int i;
    for (i = 1; i < argc; i ++)
        printf("%s\n", argv[i]);
    return 0;
}

在Unix上的示例输出:

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

在Windows上的示例输出:

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

如果您想让其他程序来扩展通配符,可以使用MinGW(MSYS)或Windows Subsystem for Linux(Win 10 1607及以上版本)。

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在内部进行管理。在Linux中,我认为它取决于shell。 - 0___________
1
你最好把你的答案澄清为在Windows CMD中。像Cygwin这样的模拟Unix环境仍然处理CLI程序的通配符。 - iBug

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接