0

我创建了一个具有以下文件结构的小项目:

.
+---include
    +---StringUtils.h
    +---Utils.h
+---src
    +---StringUtils.cpp
    +---Utils.h
+---bin
    +---libutils.so
Makefile

bin/libutils.so是用make(文件夹和.so都是在 makefile 中创建的)构建的,Makefile如下所示:

.DEFAULT_GOAL := target

LIB_NAME := log

SRC_DIR := src
INC_DIR := include
BIN_DIR := bin

INSTALL_INC_DIR := /usr/local/include/$(LIB_NAME)
INSTALL_LIB_DIR := /usr/local/lib

SOURCES := $(addprefix $(SRC_DIR)/,*.cpp)
OBJ_NAME := $(addsuffix $(addprefix $(LIB_NAME),.so),lib)

TARGET_OBJ := $(BIN_DIR)/$(OBJ_NAME)
TARGET_INCS := $(INC_DIR)/*.h

DBG := 0

INC_FLAGS := $(addsuffix $(INC_DIR),-I)
CXX_VER_FLAG := -std=c++17
DBG_FLAG := -ggdb3

CXXFLAGS := $(CXX_VER_FLAG) $(INC_FLAGS)
CXXFLAGS += -shared -fPIC

ifeq ($(DBG),1)
CXXFLAGS := -ggdb3 $(CXXFLAGS)
endif

.PHONY: all target clean install uninstall reinstall

all: target install

target: $(TARGET_OBJ)

$(TARGET_OBJ): $(BIN_DIR)/%.so: $(SOURCES)
    mkdir -p $(BIN_DIR)
    $(CXX) $(CXXFLAGS) $^ -o $@

clean:
    rm -rf $(BIN_DIR)

install: target
    sudo install -d $(INSTALL_LIB_DIR)
    sudo install -d $(INSTALL_INC_DIR)
    sudo install -m644 $(TARGET_OBJ) $(INSTALL_LIB_DIR)
    sudo install -m644 $(TARGET_INCS) $(INSTALL_INC_DIR)
    sudo ldconfig

uninstall:
    sudo $(RM) $(INSTALL_LIB_DIR)/$(OBJ_NAME)
    sudo $(RM) -r $(INSTALL_INC_DIR)
    sudo ldconfig

reinstall: uninstall install

我的问题是,当在项目文件夹中时,make自动完成功能还会将该bin/文件夹显示为可能的目标:

....../libs/libutils$ make 
all        bin/       clean      install    reinstall  target     uninstall

我想解决方案是从 中删除$(BIN_DIR)TARGET_OBJ := $(BIN_DIR)/$(OBJ_NAME)但我不完全确定如何使其工作。

此外,非常感谢对整个Makefile的任何建设性批评。

4

0 回答 0