如何编译一个目录下的所有cpp文件?

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

我在许多文件夹中有许多源文件。有没有一种方法可以一次性编译所有这些文件而无需命名它们?

我知道我可以说

g++ -o out *.cpp 

但是当我尝试时

g++ -o out *.cpp folder/*.cpp

我收到错误。

正确的做法是什么? 我知道可以使用 makefile,但是可以直接使用 g++ 来完成吗?

g++
5个回答
24
投票

通过指定

folder/*.cpp
,您将告诉 g++ 在
folder
中编译 cpp 文件。 这是正确的。

您可能缺少的是告诉 g++ 在哪里可以找到那些 cpp 文件的其他文件

#include

为此,请告诉编译器也使用

include
-I
该目录,如下所示:

g++ -o out -I ./folder *.cpp folder/*.cpp

在某些情况下,我让编译器忘记了根/当前目录中的内容,因此我使用另一个

-I
手动将其指定到当前目录
.

g++ -o out -I . -I ./folder *.cpp folder/*.cpp

11
投票

想通了! :) 我讨厌必须使用 make 或构建系统来编译我的代码,但我想将我的代码分成子文件夹以保持其干净和组织。

运行此命令(替换 RootFolderName(例如,用

.
)和 OutputName):

g++ -g $(find RootFolderName -type f -iregex ".*\.cpp") -o OutputName

find 命令将对文件 (

-iregex
) 进行不区分大小写的递归正则表达式搜索 (
-type f
)。将其放在
$()
中,然后将结果注入到您的
g++
调用中。美丽的! :)

当然,请确保您正确使用命令;您随时可以进行测试运行。


对于那些使用 Visual Studio Code 进行编译的人,我必须在带有

args: []
:
 的任务的tasks.json 
"command": "g++"

中执行此操作
"-g",
"$(find",
"code",
"-type",
"f",
"-iregex",
"'.*\\.cpp')",
"-o",
"program"

(否则它将把

$()
全部用单引号括起来。)


(感谢:user405725@https://stackoverflow.com/a/9764119/1599699评论)


0
投票

所以我遇到了这个并看到了上面的 vscode 任务,并管理了一个不同的解决方案。这将从同一目录获取所有头文件和 c 文件。然后将使用 F5 键。

任务.json

{
  "tasks": [
    {
      "type": "shell",
      "label": "C/C++: gcc-7 build active file",
      "command": "/usr/bin/gcc-7",
      "args": [
        "-I",
        "${fileDirname}",
        "-g",
        "${fileDirname}/*.c",
        "-o",
        "${fileDirname}/${fileBasenameNoExtension}"
      ],
      "options": {
        "cwd": "${workspaceFolder}"
      },
      "problemMatcher": [
        "$gcc"
      ],
      "group": {
        "kind": "build",
        "isDefault": true
      }
    }
  ],
  "version": "2.0.0"
}

0
投票

如果所有文件都包含自己的主文件,并且不属于同一项目/程序,您可能希望保留它们的原始名称并为每个文件创建一个可执行文件。如果是这种情况,您可以使用

awk
:

awk '{n=split(FILENAME, a, "."); outfile=sprintf("%s.out",a[n-1]); command=sprintf("g++ -I . %s -o %s", FILENAME, outfile); system(command); nextfile } ' *.cpp

首先,您使用

split
分隔文件名和扩展名,并将结果存储到数组
a
中。基本名称位于索引
n-1
处,扩展名位于索引
n
处。因此,我们将扩展名更改为
.out
并使用
sprintf
存储到
outfile
变量中。以同样的方式,我们创建要由 shell 中的
system
函数执行的命令。

上述命令的最短版本是:

awk '{n=split(FILENAME, a, "."); command=sprintf("g++ -I . %s -o %s.out", FILENAME, a[n-1]); system(command); nextfile } ' *.cpp

您还可以按照@Bit Fracture的建议,使用

#include
将命令修改为
-I
附加文件。

注意:如果任何文件名包含空格或多个点,此解决方案将无法正常工作。在执行命令之前,这些字符需要替换为下划线,例如,如下所述here

find . -type f -name "* *.cpp" -exec bash -c 'mv "$0" "${0// /_}"' {} \;

0
投票

我没有代表,所以我无法投票,但我在 https://code.visualstudio.com/docs/cpp/config-mingw?source=post_page---- 中找到了与 @ioaniatr 相同的 vscode 解决方案---- -a360be1487c...#_modifying-tasksjson

{
"tasks": [
  {
    "type": "cppbuild",
    "label": "C/C++: g++.exe build active file",
    "command": "C:\\msys64\\ucrt64\\bin\\g++.exe",
    "args": [
      "-fdiagnostics-color=always",
      "-g",
      "${fileDirname}/*.cpp",
      "-o",
      "${fileDirname}\\${fileBasenameNoExtension}.exe",
    ],
    "options": {
      "cwd": "${fileDirname}"
    },
    "problemMatcher": ["$gcc"],
    "group": {
      "kind": "build",
      "isDefault": true
    },
    "detail": "Task generated by Debugger."
  }
],
"version": "2.0.0"

}

我按照本指南设置编译器:https://www.youtube.com/watch?v=DMWD7wfhgNY

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