[英]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.