依赖于共享库子项目的makefile

时间:2018-08-02 12:18:15

标签: makefile shared-libraries gnu-make

所以我有一个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重新链接到新创建的库?

1 个答案:

答案 0 :(得分:1)

这正是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的一种别名。