MinGW GCC 通配符编译所有文件(Windows)

问题描述 投票:0回答:3

我在 Windows 上使用 MinGW GCC 编译器, 我需要编译一个文件夹中的所有c文件!

我已经尝试过

gcc  *.c -o  Output {folder Path}

我收到此错误

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

然后编译终止。

使用的GCC版本是4.7.1

c++ c gcc operating-system mingw
3个回答
6
投票

gcc 不接受通配符 (*.c) 作为输入文件。

您可以编写一个脚本(batch@windows 或 .sh @Linux/Unix)来查找所有源文件并一一编译它们。

但是您应该使用 makefile 或 CMAKE 来组织您的源代码及其构建系统。请阅读这里


2
投票

我正在做基本上相同的事情(即在 Windows 上使用 MinGW GCC 和 C 文件)。我对要在编译中包含其 .c/.h 文件的每个目录使用 -g 选项。

例如,如果我想编译 myFolder 目录中的所有内容,这对我有用:

gcc -g c:\myFolder\*.c -o foo.exe

请注意,您可以在命令行上多次使用 -g 选项来包含多个目录。例如,我将

.c/.h
文件组织到 myFolder 内的各个子文件夹中。因此,要告诉 gcc 关于 myFolder 内的 mySubdir,这就是我所做的:

gcc -g c:\myFolder\*.c -g c:\myFolder\mySubdir\*.c -o foo.exe

请注意,对于我放入此类子目录中的任何 .h 文件,我需要从父目录中的 C 文件引用,我必须使用

#include
中的相对路径。

例如,要从位于 myFolder 中的 C 文件引用位于 myFolder/subDir 中的 foo.h,我这样做:

#include "mySubdir/foo.h"

基本上就是这样。

现在,为了完整起见,如果您碰巧像我一样使用 VSCode 进行 C 工作(这不一定是最佳的,但还可以),那么您可以在 .vscode/tasks.json 中调整此设置,分别指定每个

-g
选项,例如:

            "command": "C:\\msys64\\mingw64\\bin\\gcc.exe",
            "args": [
                "-g",
                "${fileDirname}/*.c",
                "-g",
                "${fileDirname}/mySubdir/*.c",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],

(我的GCC版本是10.3.0)


0
投票

您可以在您的

tesks.json
中使用此任务。当您在 vscode 中按
make
底部时,它将自动在命令提示符中运行
Run C/C++ File
命令。

"tasks": [
    {
        "type": "cppbuild",
        "label": "C/C++: make.exe build active file",
        "command": "C:\\Windows\\System32\\cmd.exe",
        "args": [
            "/c",
            "chcp",
            "65001>nul",
            "&&",
            "cd",
            "${workspaceFolder}",
            "&&",
            "make"
        ],
        "group": {
            "kind": "build",
            "isDefault": true
        }
    }
]

要使用此任务,只需将

makefile
添加到项目工作区文件夹即可。如果工作区的文件结构如下,

C:.
│   makefile
│
├───.vscode
│       launch.json
│       tasks.json
│
├───build
│       test.exe
│
├───include
│       common.h
│       ...
│
├───src
│       common.c
│       ...
│
└───test
        test.c

然后

makefile
就会像这样。

# C version lable
CVERLBL = -std=c17
# warning label
WARNLBL = -Wall -Wextra
# optimization label
OPTILBL = -O3
# diagnostics message label
DXMFLBL = -fdiagnostics-color=always
# all labels in one line
LABELS  = $(DXMFLBL) $(CVERLBL) $(WARNLBL) $(OPTILBL)
# source files
SOURCES = $(wildcard src/*.c)
# source files for test
TESTSRC = $(wildcard test/*.c)
# include directory
INCDIR  = include
# output file location
OUTPUT  = build/test.exe

all:
    gcc $(LABELS) -g $(SOURCES) $(TESTSRC) -I $(INCDIR) -o $(OUTPUT)

这是构建的输出。

Starting build...
cmd /c chcp 65001>nul && C:\Windows\System32\cmd.exe /c chcp 65001>nul && cd C:\Users\usr\test_project && make
gcc -fdiagnostics-color=always -std=c17 -Wall -Wextra -O3 -g src/common.c test/test.c -I include -o build/test.exe

确保您的环境路径中有

make.exe
(或
mingw32-make.exe
)。

© www.soinside.com 2019 - 2024. All rights reserved.