如何连接两个文件夹/项目的生成文件,这两个文件夹/项目必须一起运行且独立运行

How to connect makefiles for two folders/projects that must be run both together and independent

本文关键字:两个 文件夹 运行 项目 一起 何连接 独立 文件 连接      更新时间:2023-10-16

我有以下问题: 我有一个文件夹,比如说/trunk/modules/mymodule,其中包含我必须使用构建系统构建的项目,我有/trunk/libs/mylib 文件夹,其中包含它自己的 .cpp 和 .h 文件。

我的模块需要使用我在/libs/mylib 中构建的库,但该库也将由其他项目使用。所以我希望每当我构建我的项目时,我也检查库是否已更新(并重建它是否有更改),但我希望库中的 makefile 能够独立运行,以便有人可以更新库或将其与另一个模块一起使用。

我有 2 Makefiles.in,我通过调用 include 来连接它们。/../lib/mylib/Makefile 在第一个中,并在链接我的项目时使用 -L 相同的路径 -lmylib,这也是一个 .so 库。

我逻辑上得到warning: overriding recipe for target 'distclean'

warning: overriding recipe for target 'clean'

对于两个生成文件中定义的 Clean 和 make distclean。

我该如何解决这个问题?甚至可能吗?

而不是包含你的库 Makefilelib/mylib/Makefile你可以通过运行来使用递归 MAKE

$(MAKE) -C ../../lib/mylib/Makefile

从主模块的生成文件modules/mymodule/Makefile.

您可以对目标使用类似的解决方案cleandistclean

您可以使用虚假目标mylib如下所示:

.PHONY: mylib all clean
LIBDIR=../../lib/mylib
all: mymodule
mymodule: mylib
...
mylib:
$(MAKE) -C $(LIBDIR)
clean:
$(MAKE) -C $(LIBDIR) $@
...

注意:如果将此示例中的代码复制到Makefile,请将缩进更改为使用制表符而不是空格。

您还可以考虑在trunk中使用以递归方式调用make的顶级Makefilelib/mylibmodules/mymodule

另请参阅 https://www.gnu.org/software/make/manual/make.html#Recursion

有些人认为递归是有害的,但这取决于你如何使用它。

非递归方式: 如果您控制所有生成文件并且可以完全重写它们,那么我建议您查看 https://github.com/cppfw/prorab

它允许为邻居项目提供独立的生成文件,并且还允许将一个生成文件包含在另一个生成文件中并添加编译依赖项。 请参阅 github 存储库中的 WIKI。

基本上,您将可执行文件的依赖项添加到某些libmylib.so,并且还包括构建该库的makefile。