gpt4 book ai didi

c++ - Makefile 创建两个库——一个依赖另一个

转载 作者:行者123 更新时间:2023-11-30 02:18:12 25 4
gpt4 key购买 nike

我有一个从两个源子目录构建 2 个库的父 C++ Makefile。

库 B 依赖于库 A。

cpp 文件是通过标准隐式规则编译的。

链接器步骤是通过一个函数完成的,该函数获取源代码,用 .o 替换 .cpp,然后创建依赖项:

# $(call source-to-object, source-file-list)
source-to-object = $(subst .c,.o,$(filter %.c,$1)) \
$(subst .cpp,.o,$(filter %.cpp,$1))


# $(call make-library, library-name, source-file-list, customldopt)
define make-library
libraries += $1
sources += $2

$1: $(call source-to-object,$2)
$(CXX) $(CXXFLAGS) -shared $$^ -o $(RELEASE)/$$@ -L$(RELEASE) $(LDFLAGS) $(LDLIBS) $(addprefix -l,$3)
endef

在我想在 2 个库之间引入依赖关系之前,这工作正常。我通过硬编码来做到这一点:

libB.so: libA.so

这里的问题是 $$^ 现在不会完全包含目标文件列表,但还会包含 libA.so - 它在链接器中没有位置与目标文件在同一个地方?

所以我的问题是如何引入两个库之间的依赖关系,而不用依赖库的值污染链接器行?

此陈述不正确,您确实希望在链接器行上以与表示为目标相同的形式引用库 - 请参阅我的回答

我当然可以在 libB.so 的链接器行中只包含 -lA,就像您对第 3 方依赖项所做的那样 - 但这不能保证它会在引用之前构建?

我注意到的一件事是,如果我将 $(RELEASE)/$$@ 更改为 $$@ 那么它会起作用:

g++ -fPIC -shared path/to/some_source.o libA.so -o libB.so 

这是一个问题,因为我需要 $RELEASE 目录中两个库的输出,而且我不相信上面链接器行中的 libA.so 是否正确?

它变得有点乱 - 有什么建议吗?

谢谢

最佳答案

So my question is how do I introduce the idea of a dependency between two libraries, without polluting the linker line with the value of the dependent library?

您可以指定 "order-only prerequisite"这意味着创建 libA.so 的规则必须在创建 libB.so 之前完成:

libB.so : | libA.so

与正常先决条件的区别在于,如果 libA.so 比 libB.so 更新,则不会重新构建 libB.so。在查看 libB.so 的先决条件时,Make 只关心 libA.so 是否存在,而不关心它有多老。

如果这对您没有用(因为您希望在 libA.so 更改时重建 libB.so),那么您可以使用 $(filter-out libA.so,$ 将其从先决条件中过滤掉^)

关于c++ - Makefile 创建两个库——一个依赖另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52523078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com