依赖于共享库子项目的生成文件

makefile with dependency on a shared library sub project

所以我有一个生成文件。我暂时只举一个伪例子,这样我就可以讨论这个问题并保持简单......

假设我的 makefile 中有这样的东西:

# Rule to build my test executable - with dependency on the library mytest
build: libmytest.so
    g++ test.cpp -lmytest.so

# Rule to build mytest library
libmytest.so:
    g++ mytestlib.cpp -fPIC   ... etc ...
    cc -fPIC -Wl,-soname,libmytest.so  ... etc...

所以,if/when 我更改了文件 mytestlib.cpp,我发现由于 mylibtest.so 已经存在(来自以前的构建),所以我的 build 规则认为它什么都没有要做。

所以我的问题是,如果我只更改库文件,我如何才能构建库并因此 test.cpp 重新链接到新创建的库?

这正是 make 的用途:管理依赖关系树。告诉 make 你的库依赖于它的来源:

libmytest.so: mytestlib.cpp
    g++ mytestlib.cpp -fPIC   ... etc ...
    cc -fPIC -Wl,-soname,libmytest.so  ... etc...

有了这条额外的信息,make 将比较目标及其先决条件的最后修改时间。如果目标丢失或早于它的任何先决条件,make 将重建它。这是递归的。如果一个先决条件丢失或者它自己相对于它自己的先决条件已经过时,make 将首先重建它。

顺便说一下,不要使用不是真实文件名的build目标,最好直接使用产品的文件名:

test: libmytest.so
    g++ test.cpp -lmytest.so

这样,如果 test 是最新的(比 libmytest.so 更新),make 将不会重建它。您将节省时间。

如果你真的想要一个别名,你可以添加一个假目标:

.PHONY: build

build: test

特殊 .PHONY 目标的所有先决条件都被区别对待:make 知道它们不是真正的文件名,即使存在名为 build 的文件,并且必须始终重建它们。在这种情况下,make 将检查 test 是否存在并且是最新的,如果需要重建 test,并在此处停止,因为 build 无事可做(它没有配方) .因此,您可以将其视为 test.

的一种别名