依赖于共享库子项目的makefile

依赖于共享库子项目的makefile,makefile,shared-libraries,gnu-make,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++ mytestli

所以我有一个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已经存在(从以前的构建中),我的
构建
规则认为它与此无关


因此,我的问题是,如果我只更改库文件,如何让库生成并因此测试.cpp以重新链接到新创建的库?

这正是make的目的:管理依赖关系树。只需告诉make您的库依赖于它的源:

libmytest.so: mytestlib.cpp
    g++ mytestlib.cpp -fPIC   ... etc ...
    cc -fPIC -Wl,-soname,libmytest.so  ... etc...
通过这条额外的信息,make将比较目标的最后修改时间及其先决条件。如果目标丢失或比其任何先决条件都旧,make将重建它。这是递归的。如果某个先决条件丢失或其自身相对于其自身先决条件已过期,make将首先重建它

顺便说一句,与其使用
构建
目标(它不是真实文件的名称),不如直接使用产品的文件名:

test: libmytest.so
    g++ test.cpp -lmytest.so
这样,如果
test
是最新的(比
libmytest.so
更新),make将不会重建它。你会节省时间的

如果您确实需要此别名,可以添加虚假目标:

.PHONY: build

build: test

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

只需告诉您的库取决于它的来源:<代码> LyMyTest.So:MyTestLIb.CPP < /代码>。顺便说一下,与其使用
build
目标,不如直接使用产品的文件名:
test:libmytest.so
。如果确实需要别名,可以添加虚假目标:
.phony:build
build:test
。最好在Makefile中使用stanard目标@RenaudPacalet啊哈。。。酷!,谢谢请添加以下内容作为答案:)@shawnhcorey-一篇有趣的文章,谢谢:)@code\u fodder:done。