“make”是否有构建共享对象的隐式方法?

“make”是否有构建共享对象的隐式方法?

“make”中的隐式规则定义于https://www.gnu.org/software/make/manual/make.html#toc-Using-Implicit-Rules。我无法在那里找到共享对象的默认配方。构建共享对象时是否有默认配方?

我无法奔跑

foo: foo.so

出现错误消息“不存在规则”

当我可以跑的时候

foo: foo.o

无需在 makefile 中显式添加任何规则(因此存在构建目标文件的隐式规则)。

OpenAI 告诉我(但无法在 gnu 手册中验证)这是构建共享对象的默认规则:

$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -shared -o $@ $(OBJS)

但据我所知,这似乎是错误的。

答案1

在您链接的 GNU Make 手册中,就在第 10.1 章之后,使用隐式规则, 有第10.2章,内置规则目录。正如安迪道尔顿所说,它说:

要查看您的 GNU make 版本中可用的默认规则和变量的完整列表,请make -p在没有 makefile 的目录中运行。

至少在我的系统上的 GNU make 版本中,似乎没有任何内置的目标规则*.so。尽管.LIBPATTERNS默认定义为lib%.so lib%.a,但 make 对共享对象的默认定义似乎是 ,而lib*.so不仅仅是*.so。而且,也没有默认规则。

请注意,Makefile 规则的基本结构是:

target: things_to_make_the_target_out_of ...

所以你的

foo: foo.so

似乎试图从预先存在的共享对象中创建可执行文件,这似乎很不寻常,而且可能是无意义的。

OpenAI 的答案似乎是有道理的用于构建共享对象的 Makefile 规则的基本结构。换句话说,当使用 Makefile 构建共享对象时,我希望它看起来像这样:

libsomething.so: $(OBJS)
        $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -shared -o $@ $(OBJS)

至少适当定义了 OBJS 变量。

答案2

不,不存在这样的隐含规则。

但如果你愿意,你可以这样做:

# my_favorite_recipe.mk
# list of my default rules

%.so: $(OBJ)
    $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -shared -o $@ $(OBJ)

把它放入 some 中/usr/local/include/my_favorite_recipe.mk,然后在你的 makefile 中添加

include my_favorite_recipe.mk

只是不要忘记定义OBJ列表。

相关内容