“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
列表。