我在许多文件夹中有许多源文件。有没有一种方法可以一次性编译所有这些文件而无需命名它们?
我知道我可以说
g++ -o out *.cpp
但是当我尝试时
g++ -o out *.cpp folder/*.cpp
我收到错误。
正确的做法是什么? 我知道可以使用 makefile,但是可以直接使用 g++ 来完成吗?
通过指定
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
想通了! :) 我讨厌必须使用 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评论)
所以我遇到了这个并看到了上面的 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"
}
如果所有文件都包含自己的主文件,并且不属于同一项目/程序,您可能希望保留它们的原始名称并为每个文件创建一个可执行文件。如果是这种情况,您可以使用
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// /_}"' {} \;
我没有代表,所以我无法投票,但我在 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