如何用主要方法一次编译多个cpp文件?

how to compile multiple cpp files with main methods at once?

为了举例,我有 10 个带有 main 方法的 cpp 文件。

a.cpp 
b.cpp 
c.cpp 
d.cpp 
e.cpp 

f.cpp 
g.cpp 
h.cpp 
i.cpp 
j.cpp 

所有这些脚本都做不同的事情,所以它们有自己的主要方法。

我一直在一一整理

例如

g++ -o a a.cpp

我的问题是有没有办法编译所有cpp文件并生成10个与源文件同名的不同可执行文件。

例如

a.cpp 应该生成可执行文件 a b.cpp 应该生成可执行文件 b

有超过 50 个 cpp 文件,因此它应该生成 50 个可执行文件。有没有一种方法可以使用循环来做到这一点?

感谢任何指导。

谢谢!

首先我要声明我不认为这个问题的标签与手头的问题不完全相关。 compilation 是最接近的一个,但尽管如此,我认为这个问题与特定环境文件选择和字符串操作的相关性比其他任何问题都大。

尽管如此,有几种方法可以做到这一点。它主要取决于您要在其中编译这些文件的系统和编译环境(如果有)。

基本选项将涉及 Makefiles, Shell Scripting, for Linux environments, Batch Files and PowerShell 用于 Windows 环境等。

考虑到问题的表述方式,我假设您在使用 Bash 的 Linux 系统上。一个简单的解决方案将涉及一些 commonly-distributed 工具(您可以在他们的 man pages 上找到更多关于它们的信息):

  • 回声
  • awk

假设您 运行 命令位于源文件所在的同一文件夹中,以下行应该可以解决问题:

for f in *.cpp; do g++ -o $(echo $f | awk -F.cpp '{printf "%s", }') $f; done

上面一行的作用是:

  • for f in *.cpp - 遍历当前目录中与提供的通配符匹配的所有文件。在每次迭代中,文件名存储在 $f 变量
  • echo $f | awk -F.cpp '{printf "%s", }' - 此代码段从我们获得的文件名中删除 .cpp 扩展名

编辑说明:由于此答案评论中的 @clcto's reference,通过删除对 ls -l 结果的解析改进了提议的解决方案。

只需调用awk一次,批量处理找到的文件名,其中shell-safe single-quotation个:

gfind -L . -iname "*.cpp" -type f -not -empty -print0 \
\
 | mawk 'function escQ(_,__) {
                         __=""
                    gsub(__,"&\\&&",_) return (__)(_)__ 
     
   } sub(".+","g++ +o "escQ($(NF-1))" "escQ($+_)" ")' RS='[=10=]' FS='^.*/|[.]cpp$'


g++ +o 'jmp' './jmp.cpp' 
g++ +o 'printf' './printf.cpp' 
g++ +o 'memory' './memory.cpp' 
g++ +o 'fcall' './fcall.cpp' 
g++ +o 're_cmpl' './re_cmpl.cpp' 
g++ +o 'print' './print.cpp' 
g++ +o 'array' './array.cpp' 
g++ +o 'cast' './cast.cpp' 
g++ +o 'init' './init.cpp' 
g++ +o 'files' './files.cpp' 
g++ +o 'execute' './execute.cpp' 
g++ +o 'fin' './fin.cpp' 
g++ +o 'scancode' './scancode.cpp' 
g++ +o 'scan' './scan.cpp' 
g++ +o 'split' './split.cpp' 
g++ +o 'makescan' './makescan.cpp' 
g++ +o 'bi_funct' './bi_funct.cpp' 
g++ +o 'hash' './hash.cpp' 
g++ +o 'rexp2' './rexp/rexp2.cpp' 
g++ +o 'rexpdb' './rexp/rexpdb.cpp' 
g++ +o 'rexp1' './rexp/rexp1.cpp' 
g++ +o 'rexp0' './rexp/rexp0.cpp' 
g++ +o 'rexp3' './rexp/rexp3.cpp' 
g++ +o 'wait' './rexp/wait.cpp' 
g++ +o 'rexp' './rexp/rexp.cpp' 
g++ +o 'bi_vars' './bi_vars.cpp' 
g++ +o 'da' './da.cpp' 
g++ +o 'main' './main.cpp' 
g++ +o 'error' './error.cpp' 
g++ +o 'version' './version.cpp' 
g++ +o 'kw' './kw.cpp' 
g++ +o 'parse' './parse.cpp' 
g++ +o 'field' './field.cpp' 
g++ +o 'zmalloc' './zmalloc.cpp' 
g++ +o 'code' './code.cpp' 
g++ +o 'int' './int.cpp'

现在您可以更轻松地并行化这些作业(如果这对您的用例有效)。也就是说,此解决方案不处理 sub-folders 中的重复 file-names - 根据您的需要进行调整,包括您希望编译的二进制对象的输出位置。