makefile - 没有规则来制作目标*,*需要
问题描述
我无法理解我的 makefile 有什么问题:
DIST_PATH = ../dist/libs
BUILD_PATH = ../build
MKDIR_P = mkdir -p
.PHONY: all
SHELL = /bin/sh
CC = gcc
FLAGS = -std=gnu99
CFLAGS = -fPIC -pedantic -Wall -Werror
LDFLAGS = -shared
LOG_SRCS = $(shell echo log/*.c)
LOG_HEADERS = $(shell echo log/*.h)
LOG_OBJS = $(addprefix $(BUILD_PATH)/, $(notdir $(LOG_SRCS:.c=.o)))
LOG_TARGET = $(DIST_PATH)/liblog.so
all: dirs $(LOG_TARGET)
dirs :
$(MKDIR_P) $(DIST_PATH)
$(MKDIR_P) $(BUILD_PATH)
$(LOG_TARGET) : $(LOG_OBJS)
$(CC) $(FLAGS) $(CFLAGS) -o $@ $(LDFLAGS)
我需要从log/
文件夹中的源构建一个共享库../dist/libs
并将 obj 文件放入,../build
但出现错误:
make: *** No rule to make target '../build/log.o', needed by '../dist/libs/liblog.so'. Stop.
PS我知道有很多类似的问题,但我无法从这些问题中得到如何解决我的问题。
解决方案
问题是源文件和目标文件应该放在不同的目录中,并且没有隐含的规则。
您需要为如何将源文件转换为目标文件添加规则:
$(BUILD_PATH)/%.o: log/%.c
现在make
知道如何从源文件创建目标文件。
不过还有一个问题:
$(LOG_TARGET) : $(LOG_OBJS)
$(CC) $(FLAGS) $(CFLAGS) -o $@ $(LDFLAGS)
该命令没有列出任何输入文件,您需要添加所有要链接的目标文件:
$(LOG_TARGET) : $(LOG_OBJS)
$(CC) $(FLAGS) $(CFLAGS) -o $@ $^ $(LDFLAGS)
# ^^
# List of all "prerequisites" (object files) to be linked
推荐阅读
- emacs - 如何在 Emacs 中为我的自定义 comint 模式添加自动完成功能?
- c# - 在.Net控制台应用程序中将数据写入请求流期间是否可以监听来自HTTP服务器的响应?
- android - 试图理解 Bitmap.Config.ARBG_8888
- git - 多个 git 配置文件
- python-2.7 - Chromedriver 因“无法识别的功能:chromeOptions”而崩溃
- php - PHP parse_str 输出无效字符
- awk - 使用 awk 比较 2 个文件,如果匹配则打印
- javascript - 使用 cloneElement 反应 PropTypes isRequired 警告
- html - 从多个类中选择一个元素
- mplab - 如果我在不同的端口中有七个段引脚,我该怎么办?