(c)make - 递归编译

3

假设我有以下目录:

dir1
    main.cpp
    dir2
        abc.cpp
    dir3
        def.cpp
        dir4
            ghi.cpp
            jkl.cpp

假设main.cpp包括dir2/abc.cpp和dir3/def.cpp,def.cpp包括dir4/ghi.cpp和dir4/jkl.cpp。我的问题是,如何在dir1/中有一个Makefile/CMakeLists.txt文件,递归地进入每个目录并编译*.cpp文件,然后将它们“连接”起来?抱歉我的英语不好,希望我解释得清楚!谢谢!

你的意思是main.cpp文件中包含了'dir2/abc.cpp'吗?如果是这样,请停止这样做。 - William Pursell
不,我正在使用#include "dir2/abc.h",这当然是存在的,但我认为这对这个问题并不重要... - mfolnovich
3个回答

1
一个CMakeLists.txt文件:
file(GLOB_RECURSE MAIN_SOURCES "dir1/*.cpp")

add_executable(MainExecutable ${MAIN_SOURCES})
# or
add_library(MyLibrary ${MAIN_SOURCES})

我不确定你所说的“joining”源代码是什么意思。我在这里假设你是将它们合并成库文件或可执行文件。


1

对于 makefile,dir1/Makefile 应该:

  • 声明 main.o 依赖于 dir2/abc.o 和 dir3/def.o
  • 声明如何创建 dir2/abc.o 和 dir3/def.o

至于 cmake,它会“自动”检测这些依赖关系(二进制文件依赖于 dir2/abc.o 和 dir3/def.o),因此你实际上不需要关心它。


我在考虑选择cmake,但没有指定依赖关系。在提问之前,我在网上搜索了如何制作这个(因为我完全不懂cmake),但是找不到任何信息...你能帮帮我吗? :) - mfolnovich
很不幸,这份文档并不是很好,例子也不够多。我建议你可以试着做一个小的演示来研究它。从我的经验来看,当我要编译目录以创建可执行文件时,cmake 会先编译其他包含库的目录,二进制文件应该首先进行编译。 - dimba

0

关于递归 make 是否是一件好事,存在争议。请参阅这篇博客文章,了解相对较新的正反两方面的论文调查。


我需要这个是因为我正在制作一些项目,用户应该能够添加他们的代码,并且我想避免编辑 Makefile... - mfolnovich

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