如何编译目录中的所有cpp文件?

时间:2015-11-12 00:24:18

标签: g++

我在很多文件夹中都有很多源文件..有没有办法一次性编译所有这些文件而不必命名它们?

我知道我可以说

g++ -o out *.cpp 

但是当我尝试

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

我收到错误。

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

3 个答案:

答案 0 :(得分:7)

通过指定folder/*.cpp,您告诉g ++在folder中编译cpp文件。这是对的。

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

要执行此操作,请告诉编译器同样include -I这个目录:

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

在某些情况下,我让编译器忘记了root / current目录中的内容,因此我使用另一个-I手动将其指定到当前目录.

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

答案 1 :(得分:0)

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

tasks.json


Dim tbl As Excel.Range
Dim WordApp As Word.Application
Dim myDoc As Word.Document
Dim WordTable As Word.Table

  Application.ScreenUpdating = False
  Application.EnableEvents = False

  Set tbl = ThisWorkbook.Worksheets(Sheet1.ObservationListing).ListObjects("Table1").Range

  On Error Resume Next
    
    Set WordApp = GetObject(class:="Word.Application")

      Err.Clear

      If WordApp Is Nothing Then Set WordApp = CreateObject(class:="Word.Application")

      If Err.Number = 429 Then
        MsgBox "Microsoft Word could not be found, aborting."
        GoTo EndRoutine
      End If

  On Error GoTo 0

  WordApp.Visible = True
  WordApp.Activate

  Set myDoc = WordApp.Documents.Open("insert file pile here.docx")

  tbl.Copy

  myDoc.Paragraphs(1).Range.PasteExcelTable _
    LinkedToExcel:=False, _
    WordFormatting:=False, _
    RTF:=False

  Set WordTable = myDoc.Tables(1)
  WordTable.AutoFitBehavior (wdAutoFitWindow)
  
EndRoutine:
  Application.ScreenUpdating = True
  Application.EnableEvents = True

  Application.CutCopyMode = False

End Sub```

答案 2 :(得分: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变量中。同样,我们在外壳中创建要由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// /_}"' {} \;