【发布时间】:2019-01-02 15:18:11
【问题描述】:
我在 C 中有一个客户端/服务器应用程序。服务器有自己的文件夹 dserver,客户端 dclient 也是如此。使用它们两个包含实用程序函数的文件,我创建了另一个目录,与之前的目录处于同一级别,命名为common。
我的想法是在每个子文件夹中创建每个Makefile(一个在dserver,一个在dclient,另一个在common),然后一个Makefile在主目录中运行另一个@ 987654330@ 看起来像:
all:
+$(MAKE) -C common
+$(MAKE) -C dserver
+$(MAKE) -C dclient
第一个问题是common/Makefile 不应该创建可执行文件,而只创建为客户端和服务器创建可执行文件所需的目标文件。在我的情况下是:
CXX = gcc
SOURCEDIR := ./
SOURCES := $(wildcard $(SOURCEDIR)/*.c)
OBJDIR=$(SOURCEDIR)/obj
OBJECTS := $(patsubst $(SOURCEDIR)/%.c,$(OBJDIR)/%.o, $(SOURCES))
DEPENDS := $(patsubst $(SOURCEDIR)/%.c,$(OBJDIR)/%.d, $(SOURCES))
# ADD MORE WARNINGS!
WARNING := -Wall -Wextra
$(OBJDIR)/%.o: $(SOURCEDIR)/%.c Makefile | $(OBJDIR)
$(CXX) $(WARNING) -MMD -MP -c $< -o $@
$(OBJDIR):
mkdir -p $(OBJDIR)
我的问题是它正在创建OBJDIR指定的对象目录,而不是*.o指定的对象文件:应该怎么做?
其次,在客户端和服务器Makefiles 中,我都应该在common 中包含文件的路径,然后在common 的编译结果中引用目标文件来构建可执行文件。因此以dserver/Makefile 为例,我添加了INC_PATH = -I../common/ 行并在编译中将其引用为$(CXX) $(WARNING) -MMD -MP -c $(INC_PATH) $< -o $@。但是在代码中我必须做#include "../common/utilities.h"。
有没有办法在 Makefile 中包含路径,以便在代码中只允许这样做:#include "utilities.h"?
另外,假设common 有自己的对象目录,其中包含客户端和服务器所需的对象文件,如何构建,例如服务器可执行文件引用common 目录中的对象文件和那些具体并包含在server 目录中?
dserver/Makefile 类似于(dclient/Makefile 具有相同的结构):
CXX = gcc
INC_PATH = -I../common/
SOURCEDIR := ./
SOURCES := $(wildcard $(SOURCEDIR)/*.c)
OBJDIR=./obj
OBJECTS := $(patsubst $(SOURCEDIR)/%.c,$(OBJDIR)/%.o, $(SOURCES))
DEPENDS := $(patsubst $(SOURCEDIR)/%.c,$(OBJDIR)/%.d, $(SOURCES))
# ADD MORE WARNINGS!
WARNING := -Wall -Wextra
# .PHONY means these rules get executed even if
# files of those names exist.
.PHONY: all clean
# The first rule is the default, ie. "make",
# "make all" and "make parking" mean the same
all: server
clean:
$(RM) $(OBJECTS) $(DEPENDS) server
# Linking the executable from the object files
# $^ # "src.c src.h" (all prerequisites)
../server: $(OBJECTS)
$(CXX) $(WARNING) $(INC_PATH) $^ -o $@
#$(CXX) $(WARNING) $(CXXFLAGS) $(INC_PATH) $^ -o $@ $(LIBS)
-include $(DEPENDS)
$(OBJDIR):
mkdir -p $(OBJDIR)
$(OBJDIR)/%.o: $(SOURCEDIR)/%.c Makefile | $(OBJDIR)
$(CXX) $(WARNING) -MMD -MP -c $(INC_PATH) $< -o $@
【问题讨论】:
-
为您提供的非递归 make 示例:stackoverflow.com/a/7321954/412080
标签: c makefile compilation