两种模式规则的差异及makefile的集成
我正在学习makefile,我对模式规则的使用和如何使用感到有点困惑: 我有两个问题:两种模式规则的差异及makefile的集成,makefile,Makefile,我正在学习makefile,我对模式规则的使用和如何使用感到有点困惑: 我有两个问题: 模式规则的差异形式 在一些示例中,我看到了这种形式: .c.o: $(CC) $(CFLAGS) $< -o $@ 我这样做: $(SERV_EXE): $(OBJECTS_SERV) $(CC) $(CFLAGS) -o $@ $^ newDeck.o $(CLI_EXE): $(OBJECTS_CLI) $(CC) $(CFLAGS) -o $@ $^ 但是我想使用模式规则从命令
.c.o:
$(CC) $(CFLAGS) $< -o $@
我这样做:
$(SERV_EXE): $(OBJECTS_SERV)
$(CC) $(CFLAGS) -o $@ $^ newDeck.o
$(CLI_EXE): $(OBJECTS_CLI)
$(CC) $(CFLAGS) -o $@ $^
但是我想使用模式规则从命令执行makebrsserver
和makebrsclient
。
这样就够了吗
%.o:%.c
$(CC)$(CFLAGS)-c$<-o$@
如您所见,我只需要编写
brsserver
,其中包括一个名为newDeck.o
的模块.c.o
表单是一个后缀规则。POSIX标准中为make
程序定义了此表单
%.o:%.c
是一个模式规则。这是一个GNU make特性,不是POSIX标准的一部分(我认为可能还有一些其他make实现具有类似的特性)
在这种情况下,它们是等价的。然而,模式规则通常比后缀规则灵活得多;例如,您不能这样表示模式规则:
.PHONY: all brsserver brsclient clean
CC = gcc
CFLAGS = -Wall -pedantic -g -lpthread
# source files for server
SOURCES_SERV = brsserver.c func_client_serv.c comsock.c bris.c users.c aux_func.c Stack.c
# source files for client
SOURCES_CLI = brsclient.c func_client_serv.c comsock.c bris.c users.c aux_func.c Stack.c
# object file for server
OBJECTS_SERV = $(SOURCES_SERV:.c = .o)
# object file for client
OBJECTS_CLI = $(SOURCES_SERV:.c = .o)
# executable file server
SERV_EXE = brsserver
# executable file client
CLI_EXE = brsclient
foo%.o : bar%.c
作为后缀规则。我不理解你的最后一个问题。为什么
现在不让brsserver
或让brsclient
正常工作,因为你有很多东西?我也不明白你说的newDeck.o
是什么意思;在你的例子中没有提到类似的东西,我没有说它不起作用。我只想使用模式规则。正如你所看到的,NewDeck是我用于编译服务器的一个模块。如果你想构建一个新的源文件并链接到服务器,你应该将它添加到SOURCES\u SRV
变量中,而不是链接器规则中。这就是为什么你有一个变量。将newDeck.c
添加到SOURCES\u SRV=…
的末尾,您就完成了。哦,您不应该将-lpthread
添加到CFLAGS
中CFLAGS
采用编译器标志;任何以-l
开头的标志都是一个链接器标志,告诉它在哪里可以找到库。-l
标志通常进入LDLIBS
变量。但是,如果您真的在使用线程,那么仅仅将-lpthread
添加到链接行是不够的。您应该将-pthread
(注意不要-lpthread
!)添加到CFLAGS
,这样您就不需要使用-lpthread
。谢谢-lpthread
。好的,谢谢您的解释。那么,我必须以何种方式使用模式规则?除了我的汇编之外?对不起,我不明白这个问题。
foo%.o : bar%.c