使用g++编译多个源代码目录

5
我的 c++ 项目具有以下结构。
src
|
|source1.cpp
|source2.cpp
|
|<srcfolder1>
|__ source11.cpp
|__ source12.cpp
|
|<srcfolder2>
|__ source21.cpp
|__ source22.cpp

可以看到有多个文件夹和多个源文件。 我应该给g++什么命令来将所有源文件编译成一个单独的.o文件?

把所有的源文件都给它? - R. Martinho Fernandes
大约有100个源文件,太多了无法在命令行提示符上逐个列出。 - pdeva
4
我认为在复杂项目中通常的做法是在每个子文件夹中拥有Makefiles,并从父文件夹中调用它们。顺便问一下,你为什么不使用集成开发环境呢? - enobayram
我之前是在 windows 上使用 Visual Studio 进行编译工作,现在需要在 Linux 上进行编译,但是我对命令行操作不熟悉,感到茫然无措。 - pdeva
我推荐Qt Creator作为一个可在Linux、Mac和Windows上运行的替代选择 :) - mmirzadeh
4个回答

6
如果你有很多源文件,你真的应该考虑写一个Makefile: http://mrbook.org/tutorials/make/
例如,你可以使用类似这样的语法来编译多个文件(在Makefile中):
%.o : $(SRC_FOLDER)/%.cpp
  $(CXX) -c -o $@ $<

Rolle,我的makefile知识现在只有你链接的那篇文章中所阅读到的内容;) 你能否解释一下你所描述的命令?百分号代表什么意思? - pdeva
2
在网上一定有更多的教程可以比我在这里解释得更好。基本上,以上内容是这样的:对于SRC_FOLDER(在其他地方定义)中的每个源文件,使用在CXX中定义的命令行参数进行编译,使用-c -o标志,并将它们命名为与cpp文件相同但以.o结尾的名称。另请参见我上面的编辑。 - Rolle

2
您还可以使用构建系统来为您生成实际的makefile。当您尝试扩展项目并维护一个良好的makefile可能成为一项艰巨的任务时,这变得非常重要。我建议您花些时间学习其中之一。例如Scons、GNU autotools、qmake和Cmake等。我强烈推荐使用qmake或Cmake,因为它们都是跨平台且易于学习。
另一个选择是简单地使用IDE!我所知道的最好的Linux C++ IDE是跨平台的Qt Creator。在底层,它支持qmake和Cmake项目。

1

如果你习惯于使用Visual Studio并且需要在Linux下编译文件,那么没有必要从头开始在命令行上做所有的事情 ;)

就像GradGuy指出的那样,QtCreator是一个很棒的IDE,我也用它来进行非Windows构建。然而,如果你不做任何GUI相关的工作,你可能想要将它与cmake一起使用,因为Qt主要是关于GUI的。

cmake是一个生成解决方案文件(如VS的.sln文件)的生成器,它独立于你正在运行的IDE或操作系统。它是一种自下而上的方法,你只需要很少的东西就可以开始。

以下是一些让你开始的步骤

  • 安装QtCreator和CMake
  • 编写一个文件,告诉cmake你的源文件在哪里以及如何找到它们。
  • src文件夹上面创建一个名为CMakeLists.txt的文件,并在其中写入以下内容:

    project( myProject )
    
    # 设置包含目录(如果有)
    include_directories( include )
    
    # 告诉cmake哪些是你的源文件
    set( MY_CPP_FILES 
        src/source1.cpp
        src/source2.cpp
        src/srcfolder1/source11.cpp
        src/srcfolder1/source12.cpp
        src/srcfolder2/source21.cpp
        src/srcfolder2/source22.cpp )
    
    # 如果你要创建可执行文件,则可以这样做
    # 注意${MY_CPP_FILES}将被替换为其内容
    add_executable( myExec ${MY_CPP_FILES} )
    
    # 如果你想要一个库,则可以这样做
    add_library( myStaticLib STATIC ${MY_CPP_FILES} ) # 创建一个静态库
    add_library( mySharedLib SHARED ${MY_CPP_FILES} ) # 创建一个共享库
    
  • 现在启动QtCreator并选择文件 -> 打开文件或项目,然后选择驱动器上的CMakeLists.txt

  • 现在会要求你选择结果存储的路径(以及所有中间文件)
  • 点击运行CMake
  • 最后选择构建 -> 构建全部

祝你好运!


0

也许,最直接的答案是这样的:

g++ $(find src -name '*.cpp')

话虽如此,拥有如此多的翻译单元,拥有一个Makefile可以帮助您在编辑源文件并构建进行测试时大大减少构建时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接