Makefile更新了库依赖项

时间:2010-07-08 02:03:01

标签: c++ makefile linker dependencies

我有一个大型makefile,它可以构建多个库,安装它们,然后继续构建与这些已安装的库链接的对象。我的麻烦是我想使用“-lfoo -lbar”作为g ++标志来链接两个已安装的库,但依赖关系搞砸了。如果我更改库foo所依赖的标题“42.h”,那么make当然会重建并安装它,但是似乎注意到我的对象“marvin”使用了“ - lfoo“and marvin与旧版本保持联系...... :(

到目前为止,我一直在做:

$(myObject): $(localSrc) /explicit/path/to/lib/libfoo.a
            $(CXX) $(CPPFLAGS) $(INCFLAGS) -o $@ $^ $(LINKFLAGS) $(LINKLIBS)

但我现在处于不再可行的选择。我需要简单地将库“-lfoo -lbar”添加到LINKFLAGS变量中并让链接器解决问题吗?

与此同时,我已经使用了一些命令来显式地删除有问题的目标文件,然后调用make,但这变得很愚蠢。我很紧张,但如果有必要,我可以在周五晚上或周六早上发布一个小例子。

因此,我觉得我回到了一些糟糕的Windows版本地狱。我能做些什么来让链接器注意到构建对象的库的版本,并在这些库发生更改时重新链接它?

更新:所以到目前为止我还没有机会崩溃这些建议。我正在做的缺点是使用静态库。所以我不能使用ldd。所以我重写了我的Makefile,找到了解决这个问题的方法。如果我有时间,我会发布我的所作所为。

3 个答案:

答案 0 :(得分:7)

这个怎么样:

LIBS = foo bar blah # and so on

LINKFLAGS = $(addprefix -l,$(LIBS))

LIBPATHS = $(patsubst %,/explicit/path/to/lib/lib%.so, $(LIBS))

$(myObject): $(localSrc) $(LIBPATHS)
        $(CXX) $(CPPFLAGS) $(INCFLAGS) -o $@ $^ $(LINKFLAGS) $(LINKLIBS)

答案 1 :(得分:2)

据我所知,make一般不会很好地自动检测这样的依赖关系。 (这不是真正的工作; make是一个更高级别的工具,它不知道它产生的命令的细节或这些命令的作用。)

有两种选择。

首先,您可以在$(myObject)上运行ldd,将其库列表保存到文本文件中,然后将其作为依赖项列表反馈到您的makefile中。 (这类似于使用-MD将头文件列表保存到文本文件中,然后将其作为源文件编译的附加规则反馈到makefile中,正如Sam Miller建议的那样。)

其次,您可以使用LINKLIBS变量,并使用GNU Make的functions让相同的变量适用于依赖项和命令行选项。例如:

LINKLIBS := /explicit/path/to/lib/libfoo.so
$(myObject): $(localSrc) $(LINKLIBS)
        $(CXX) $(CPPFLAGS) $(INCFLAGS) -o $@ $^ $(LINKFLAGS) $(patsubst %,-l:%,$(LINKLIBS))

答案 2 :(得分:0)

您可以尝试像-MD这样的gcc依赖关系生成参数,如果您使用它们,我不清楚。