Gcc makefile一步多个源文件编译规则

Gcc makefile一步多个源文件编译规则,gcc,makefile,Gcc,Makefile,我的目录结构如下: 生成文件 src/ file1.cpp file2.cpp 公司/ file1.h file2.h 现在,我想编写一个make规则来创建一个“objs”目录,并将所有对象(.o文件)放入“objs”中,然后从中构建一个库。我想一次性完成这项工作,而不是为每个.cpp文件编写一条规则。 这就是我所尝试的: SRC_DIR:= src/ INC_DIR:=inc/ SRC_PATH:=$(foreach var, $(SRC_DIR), $(wildcard $(var)*.c

我的目录结构如下: 生成文件 src/ file1.cpp file2.cpp 公司/ file1.h file2.h 现在,我想编写一个make规则来创建一个“objs”目录,并将所有对象(.o文件)放入“objs”中,然后从中构建一个库。我想一次性完成这项工作,而不是为每个.cpp文件编写一条规则。 这就是我所尝试的:

SRC_DIR:= src/
INC_DIR:=inc/

SRC_PATH:=$(foreach var, $(SRC_DIR), $(wildcard $(var)*.cpp))
OBJ_PATH:=$(patsubst %.cpp,%.o,$(SRC_PATH))
OBJ_PATH:=$(notdir $(OBJ_PATH))
OBJ_DIR:=./objs
OBJ_PATH:=$(addprefix $(OBJ_DIR)/,$(OBJ_PATH))

TARGET:=libcommon.a

all:$(TARGET)

$(TARGET): $(OBJ_PATH)
    ar -rcs $(TARGET) $(OBJ_PATH)
$(OBJ_PATH): $(SRC_PATH)    
    mkdir -p $(OBJ_DIR)
    $(CXX) -o $(OBJ_PATH) -c $(SRC_PATH) -I$(INC_DIR)
但我得到了这个错误:

[root@localhost common]# make
mkdir -p ./objs
g++   -o ./objs/file1.o ./objs/file2.o -c  src/file1.cpp src/file2.cpp -Iinc/
g++: ./objs/file1.o: No such file or directory
g++: cannot specify -o with -c or -S with multiple files

我在这个话题上做了很多搜索。没有得到任何帮助。请指出我所犯的错误。

代码中的错误:使用列表代替$@

我喜欢在子目录中自动搜索带有src和header的解决方案

OBJ_DIR:=./objs

SOURCES:=$(wildcard */*.cpp *.cpp)
OBJECTS:= $(notdir $(SOURCES:.cpp=.o))
OBJECTS_LOCAL:=$(SOURCES:.cpp=.o)
LOCAL_PATHS_HEADERS:=$(sort $(dir $(wildcard *.h */*.h)))

OBJ_PATH:=$(addprefix $(OBJ_DIR)/, $(OBJECTS))

TARGET:=libcommon.a

all:$(TARGET)

$(TARGET): $(OBJECTS_LOCAL)
        ar -rcs $@ $(OBJ_PATH)

$(OBJECTS_LOCAL):
        mkdir -p $(OBJ_DIR)
        $(CC) -c $(@:.o=.cpp) -o $(OBJ_DIR)/$(notdir $@) $(addprefix -I,$(LOCAL_PATHS_HEADERS))
--加

解决方案wo已重新编译,但需要手动控制SRC_DIR

OBJ_DIR:=obj
SRC_DIR:=src

SOURCES:=$(wildcard $(SRC_DIR)/*.cpp)
OBJECTS_PATH:=$(addprefix $(OBJ_DIR)/, $(notdir $(SOURCES:.cpp=.o)))
LOCAL_PATHS_HEADERS:=$(sort $(dir $(wildcard *.h */*.h)))

TARGET:=libcommon.a

all:$(TARGET)

$(TARGET): $(OBJECTS_PATH)
        ar -rcs $@ $^

$(OBJECTS_PATH): $(OBJ_DIR)/%.o : $(SRC_DIR)/%.cpp
        mkdir -p $(OBJ_DIR)
        $(CC) -o  $@ -c $< $(addprefix -I,$(LOCAL_PATHS_HEADERS))
OBJ_DIR:=OBJ
SRC_DIR:=SRC
来源:=$(通配符$(SRC_DIR)/*.cpp)
对象\u路径:=$(addprefix$(OBJ\u DIR)/,$(notdir$(源代码:.cpp=.o)))
本地路径头:=$(排序$(目录$(通配符*.h*/*.h)))
目标:=libcommon.a
全部:$(目标)
$(目标):$(对象\路径)
ar-rcs$@$^
$(对象路径):$(对象目录)/%.o:$(SRC目录)/%.cpp
mkdir-p$(OBJ_DIR)
$(CC)-o$@-c$<$(addprefix-I,$(本地路径\头))

代码中的错误:使用列表代替$@

我喜欢在子目录中自动搜索带有src和header的解决方案

OBJ_DIR:=./objs

SOURCES:=$(wildcard */*.cpp *.cpp)
OBJECTS:= $(notdir $(SOURCES:.cpp=.o))
OBJECTS_LOCAL:=$(SOURCES:.cpp=.o)
LOCAL_PATHS_HEADERS:=$(sort $(dir $(wildcard *.h */*.h)))

OBJ_PATH:=$(addprefix $(OBJ_DIR)/, $(OBJECTS))

TARGET:=libcommon.a

all:$(TARGET)

$(TARGET): $(OBJECTS_LOCAL)
        ar -rcs $@ $(OBJ_PATH)

$(OBJECTS_LOCAL):
        mkdir -p $(OBJ_DIR)
        $(CC) -c $(@:.o=.cpp) -o $(OBJ_DIR)/$(notdir $@) $(addprefix -I,$(LOCAL_PATHS_HEADERS))
--加

解决方案wo已重新编译,但需要手动控制SRC_DIR

OBJ_DIR:=obj
SRC_DIR:=src

SOURCES:=$(wildcard $(SRC_DIR)/*.cpp)
OBJECTS_PATH:=$(addprefix $(OBJ_DIR)/, $(notdir $(SOURCES:.cpp=.o)))
LOCAL_PATHS_HEADERS:=$(sort $(dir $(wildcard *.h */*.h)))

TARGET:=libcommon.a

all:$(TARGET)

$(TARGET): $(OBJECTS_PATH)
        ar -rcs $@ $^

$(OBJECTS_PATH): $(OBJ_DIR)/%.o : $(SRC_DIR)/%.cpp
        mkdir -p $(OBJ_DIR)
        $(CC) -o  $@ -c $< $(addprefix -I,$(LOCAL_PATHS_HEADERS))
OBJ_DIR:=OBJ
SRC_DIR:=SRC
来源:=$(通配符$(SRC_DIR)/*.cpp)
对象\u路径:=$(addprefix$(OBJ\u DIR)/,$(notdir$(源代码:.cpp=.o)))
本地路径头:=$(排序$(目录$(通配符*.h*/*.h)))
目标:=libcommon.a
全部:$(目标)
$(目标):$(对象\路径)
ar-rcs$@$^
$(对象路径):$(对象目录)/%.o:$(SRC目录)/%.cpp
mkdir-p$(OBJ_DIR)
$(CC)-o$@-c$<$(addprefix-I,$(本地路径\头))

代码中的错误:使用列表代替$@

我喜欢在子目录中自动搜索带有src和header的解决方案

OBJ_DIR:=./objs

SOURCES:=$(wildcard */*.cpp *.cpp)
OBJECTS:= $(notdir $(SOURCES:.cpp=.o))
OBJECTS_LOCAL:=$(SOURCES:.cpp=.o)
LOCAL_PATHS_HEADERS:=$(sort $(dir $(wildcard *.h */*.h)))

OBJ_PATH:=$(addprefix $(OBJ_DIR)/, $(OBJECTS))

TARGET:=libcommon.a

all:$(TARGET)

$(TARGET): $(OBJECTS_LOCAL)
        ar -rcs $@ $(OBJ_PATH)

$(OBJECTS_LOCAL):
        mkdir -p $(OBJ_DIR)
        $(CC) -c $(@:.o=.cpp) -o $(OBJ_DIR)/$(notdir $@) $(addprefix -I,$(LOCAL_PATHS_HEADERS))
--加

解决方案wo已重新编译,但需要手动控制SRC_DIR

OBJ_DIR:=obj
SRC_DIR:=src

SOURCES:=$(wildcard $(SRC_DIR)/*.cpp)
OBJECTS_PATH:=$(addprefix $(OBJ_DIR)/, $(notdir $(SOURCES:.cpp=.o)))
LOCAL_PATHS_HEADERS:=$(sort $(dir $(wildcard *.h */*.h)))

TARGET:=libcommon.a

all:$(TARGET)

$(TARGET): $(OBJECTS_PATH)
        ar -rcs $@ $^

$(OBJECTS_PATH): $(OBJ_DIR)/%.o : $(SRC_DIR)/%.cpp
        mkdir -p $(OBJ_DIR)
        $(CC) -o  $@ -c $< $(addprefix -I,$(LOCAL_PATHS_HEADERS))
OBJ_DIR:=OBJ
SRC_DIR:=SRC
来源:=$(通配符$(SRC_DIR)/*.cpp)
对象\u路径:=$(addprefix$(OBJ\u DIR)/,$(notdir$(源代码:.cpp=.o)))
本地路径头:=$(排序$(目录$(通配符*.h*/*.h)))
目标:=libcommon.a
全部:$(目标)
$(目标):$(对象\路径)
ar-rcs$@$^
$(对象路径):$(对象目录)/%.o:$(SRC目录)/%.cpp
mkdir-p$(OBJ_DIR)
$(CC)-o$@-c$<$(addprefix-I,$(本地路径\头))

代码中的错误:使用列表代替$@

我喜欢在子目录中自动搜索带有src和header的解决方案

OBJ_DIR:=./objs

SOURCES:=$(wildcard */*.cpp *.cpp)
OBJECTS:= $(notdir $(SOURCES:.cpp=.o))
OBJECTS_LOCAL:=$(SOURCES:.cpp=.o)
LOCAL_PATHS_HEADERS:=$(sort $(dir $(wildcard *.h */*.h)))

OBJ_PATH:=$(addprefix $(OBJ_DIR)/, $(OBJECTS))

TARGET:=libcommon.a

all:$(TARGET)

$(TARGET): $(OBJECTS_LOCAL)
        ar -rcs $@ $(OBJ_PATH)

$(OBJECTS_LOCAL):
        mkdir -p $(OBJ_DIR)
        $(CC) -c $(@:.o=.cpp) -o $(OBJ_DIR)/$(notdir $@) $(addprefix -I,$(LOCAL_PATHS_HEADERS))
--加

解决方案wo已重新编译,但需要手动控制SRC_DIR

OBJ_DIR:=obj
SRC_DIR:=src

SOURCES:=$(wildcard $(SRC_DIR)/*.cpp)
OBJECTS_PATH:=$(addprefix $(OBJ_DIR)/, $(notdir $(SOURCES:.cpp=.o)))
LOCAL_PATHS_HEADERS:=$(sort $(dir $(wildcard *.h */*.h)))

TARGET:=libcommon.a

all:$(TARGET)

$(TARGET): $(OBJECTS_PATH)
        ar -rcs $@ $^

$(OBJECTS_PATH): $(OBJ_DIR)/%.o : $(SRC_DIR)/%.cpp
        mkdir -p $(OBJ_DIR)
        $(CC) -o  $@ -c $< $(addprefix -I,$(LOCAL_PATHS_HEADERS))
OBJ_DIR:=OBJ
SRC_DIR:=SRC
来源:=$(通配符$(SRC_DIR)/*.cpp)
对象\u路径:=$(addprefix$(OBJ\u DIR)/,$(notdir$(源代码:.cpp=.o)))
本地路径头:=$(排序$(目录$(通配符*.h*/*.h)))
目标:=libcommon.a
全部:$(目标)
$(目标):$(对象\路径)
ar-rcs$@$^
$(对象路径):$(对象目录)/%.o:$(SRC目录)/%.cpp
mkdir-p$(OBJ_DIR)
$(CC)-o$@-c$<$(addprefix-I,$(本地路径\头))

该解决方案工作正常。谢谢你的帮助。但这里的一个问题是,每次执行make时,都会重新编译源代码。我们如何纠正这一点?。我的意思是,只有当.c文件的时间戳发生变化时,才应该编译它。@deadbeef我有其他解决方案,但它对自动执行有一些限制。这正是我想要的。这符合我的期望。但我不明白这行:“$(对象路径):$(对象目录)/%.o:$(SRC目录)/%.cpp”。你能解释一下这句话是怎么说的吗?@deadbeef手册解释得比我好。你需要阅读,解决方案很好。谢谢你的帮助。但这里的一个问题是,每次执行make时,都会重新编译源代码。我们如何纠正这一点?。我的意思是,只有当.c文件的时间戳发生变化时,才应该编译它。@deadbeef我有其他解决方案,但它对自动执行有一些限制。这正是我想要的。这符合我的期望。但我不明白这行:“$(对象路径):$(对象目录)/%.o:$(SRC目录)/%.cpp”。你能解释一下这句话是怎么说的吗?@deadbeef手册解释得比我好。你需要阅读,解决方案很好。谢谢你的帮助。但这里的一个问题是,每次执行make时,都会重新编译源代码。我们如何纠正这一点?。我的意思是,只有当.c文件的时间戳发生变化时,才应该编译它。@deadbeef我有其他解决方案,但它对自动执行有一些限制。这正是我想要的。这符合我的期望。但我不明白这行:“$(对象路径):$(对象目录)/%.o:$(SRC目录)/%.cpp”。你能解释一下这句话是怎么说的吗?@deadbeef手册解释得比我好。你需要阅读,解决方案很好。谢谢你的帮助。但这里的一个问题是,每次执行make时,都会重新编译源代码。我们如何纠正这一点?。我的意思是,只有当.c文件的时间戳发生变化时,才应该编译它。@deadbeef我有其他解决方案,但它对自动执行有一些限制。这正是我想要的。这符合我的期望。但我不明白这行:“$(对象路径):$(对象目录)/%.o:$(SRC目录)/%.cpp”。你能解释一下这句话是怎么说的吗?@deadbeef手册解释得比我好。你需要阅读和阅读