如何一次编译多个带有main方法的cpp文件?

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

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

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

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

所有这些脚本都做不同的事情,因此它们有自己的 main 方法。

我已经一一整理了

例如

g++ -o a a.cpp

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

例如

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

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

我感谢任何指导。

谢谢!

c++ compilation g++
3个回答
1
投票

首先我要声明我不认为这个问题的标签与当前的问题不完全相关。

compilation
是最接近的一个,但尽管如此,我认为这个问题与特定环境文件选择和字符串操作比其他任何事情都更相关。

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

基本选项将涉及MakefilesShell Scripting(适用于 Linux 环境)、Batch FilesPowerShell(适用于 Windows 环境)等等。

考虑到问题的提出方式,我假设您在使用 Bash 的 Linux 系统上。一个简单的解决方案将涉及一些常见的分发工具(您可以在其手册页上找到有关每个工具的更多信息):

  • 对于
  • 回声
  • awk

假设您在源文件所在的同一文件夹中运行命令,则以下行应该可以满足您的要求:

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

上面这行代码的作用是:

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

编辑注释:由于本答案评论中的

@clcto
reference,通过删除对 ls -l 结果的解析来改进了提议的解决方案。


0
投票

只需调用

awk
一次,批量处理找到的文件名,包括它们的 shell 安全单引号 :

gfind -L . -iname "*.cpp" -type f -not -empty -print0 \
\
 | mawk 'function escQ(_,__) {
                         __="\47"
                    gsub(__,"&\\\\&&",_) return (__)(_)__ 
     
   } sub(".+","g++ +o "escQ($(NF-1))" "escQ($+_)" ")' RS='\0' 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'

现在您可以更轻松地并行化这些作业(如果这适合您的用例)。也就是说,此解决方案没有对子文件夹中的重复文件名进行任何处理 - 根据您的需要进行调整,包括您想要编译的二进制对象的输出位置的位置。


0
投票

您可以创建文件abcde.cpp 像这样。

#include "a.cpp"
#include "b.cpp"
#include "c.cpp"
#include "d.cpp"
#include "e.cpp"

一次性编译abcde.cpp即可。

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