繁体   English   中英

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

[英]makefile multiple source file compilation rule in one step

我有一个目录结构,如下所示:Makefile src / file1.cpp file2.cpp inc / 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和标头的解决方案。

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))

- 加

重新编译了解决方案,但需要手动控制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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM