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



所以我有一个makefile。我现在只举一个伪例子,这样我就可以谈论这个问题并保持简单。。。

假设我的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...

因此,如果/当我更改文件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目标的所有先决条件都有不同的处理:即使存在名为build的文件,也要知道它们不是真正的文件名,并且必须始终重新生成。在这种情况下,make将检查test是否存在并且是最新的,如果需要,重建test,并在此停止,因为对build没有任何操作(它没有配方(。因此,您可以将其视为test的一种别名。

最新更新