我创建了一个具有以下文件结构的小项目:
.
+---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的任何建设性批评。