gpt4 book ai didi

makefile - 让 make 在特定目录中创建目标文件

转载 作者:行者123 更新时间:2023-12-03 11:01:12 26 4
gpt4 key购买 nike

GNU Make 3.82
gcc 4.7.2
c89

我有以下制作文件:
INC_PATH=-I/home/dev_tools/apr/include/apr-1
LIB_PATH=-L/home/dev_tools/apr/lib
LIBS=-lapr-1 -laprutil-1
RUNTIME_PATH=-Wl,-rpath,/home/dev_tools/apr/lib
CC=gcc
CFLAGS=-Wall -Wextra -g -m32 -O2 -D_DEBUG -D_THREAD_SAFE -D_REENTRANT -D_LARGEFILE64_SOURCE $(INC_PATH)
SOURCES=$(wildcard src/*.c)
OBJECTS=$(patsubst %.c, %.o, $(SOURCES))

EXECUTABLE=bin/to

all: build $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
$(CC) $(CFLAGS) -o $@ $(RUNTIME_PATH) $(OBJECTS) $(LIB_PATH) $(LIBS)

$(OBJECTS): $(SOURCES)
$(CC) $(CFLAGS) -c $(SOURCES) $(LIB_PATH) $(LIBS)

build:
@mkdir -p bin

clean:
rm -rf $(EXECUTABLE) $(OBJECTS) bin
find . -name "*~" -exec rm {} \;
find . -name "*.o" -exec rm {} \;

我的目录结构是这样的 project/src project/bin .我的 Makefile 位于 project (root)文件夹,我所有的 *.h 和 *.c 都在 src 目录中。目前我只有一个名为 timeout.c 的源文件

我收到此错误:
gcc: error: src/timeout.o: No such file or directory

我用它来获取所有源文件:
SOURCES=$(wildcard src/*.c)

和目标文件:
OBJECTS=$(patsubst %.c, %.o, $(SOURCES))

但是,make 似乎在 Makefile 所在的项目根文件夹中创建了目标文件。它不应该把它放在 src 目录中吗?

最佳答案

你在这条规则中有两个问题(好吧,三个):

$(OBJECTS): $(SOURCES)
$(CC) $(CFLAGS) -c $(SOURCES) $(LIB_PATH) $(LIBS)

您还没有注意到,该规则使每个对象都依赖于所有来源,并尝试以这种方式构建。只要您只有一个来源就不是问题。使用 static pattern rule 轻松修复和 an automatic variable :
$(OBJECTS): src/%.o : src/%.c
$(CC) $(CFLAGS) -c $< $(LIB_PATH) $(LIBS)

此外,命令 ("$(CC)...") 没有指定输出文件名,因此 gcc 会从源文件名中推断出来;如果你给它 src/timeout.c ,它会产生 timeout.o (在工作目录中, project/ )。因此,您应该指定输出文件的所需路径。使用另一个自动变量很容易做到:
$(OBJECTS): src/%.o : src/%.c
$(CC) $(CFLAGS) -c $< $(LIB_PATH) $(LIBS) -o $@

关于makefile - 让 make 在特定目录中创建目标文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14639794/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com