gcc 4.7.2
c89
GNU Make 3.82
我正在尝试编译我使用此Makefile的程序。我目前只有1个src文件,但稍后我会有更多内容。
我试图让Makefile创建bin目录(如果它不存在)并将二进制可执行文件放在那里。
INC_PATH=-I/home/dev_tools/apr/include/apr-1
LIB_PATH=-L/home/dev_tools/apr/lib
LIBS=-lapr-1
RUNTIME_PATH=/home/dev_tools/apr/lib
CC=gcc
CFLAGS=-Wall -Wextra -g -m32 -D_DEBUG -D_THREAD_SAFE -D_REENTRANT -D_LARGEFILE64_SOURCE -O2 $(INC_PATH)
OBJECTS=timeout.o
EXECUTABLE=bin/to
all: build $(EXECUTABLE)
$(EXECUTABLE):
$(CC) -m32 -o $@ -Wl,-rpath,$(RUNTIME_PATH), $(LIB_PATH) $(OBJECTS) $(LIBS)
build:
@mkdir -p bin
clean:
rm -rf *~ timeout *.o
我收到此错误:
make
gcc -m32 -o bin/to -Wl,-rpath,/home/dev_tools/apr/lib, -L/home/dev_tools/apr/lib timeout.o -lapr-1
gcc: error: timeout.o: No such file or directory
make: *** [bin/to] Error 1
当我删除$(OBJECTS)
时,我得到以下内容:
gcc -m32 -o bin/to -Wl,-rpath,/home/dev_tools/apr/lib, -L/home/dev_tools/apr/lib -lapr-1
/usr/bin/ld: cannot find : No such file or directory
collect2: error: ld returned 1 exit status
make: *** [bin/to] Error 1
不确定我在哪里出错。
答案 0 :(得分:2)
您尚未指定如何构建目标timeout.o。
您需要添加以下代码:
timeout.o: timeout.c
$(CC) $(CFLAGS) -c -o $@ $<
如果最终需要编译更多源文件,可以使用这样的模式匹配规则:
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
答案 1 :(得分:2)
Makefile可能有点棘手。因为您想继续向OBJECT
变量添加更多对象,所以我实际上会向EXECUTABLE
添加一个先决条件,以确保编译所有对象。从那里,自动规则推理应该处理其余的事情。
基本上用以下代码替换:
$(EXECUTABLE): $(OBJECTS)
$(CC) -m32 -o $@ -Wl,-rpath,$(RUNTIME_PATH), $(LIB_PATH) $(OBJECTS) $(LIBS)
答案 2 :(得分:1)
显示错误,因为make无法在当前目录中找到timeout.o文件。 如果你有timeout.c文件,那么将以下内容添加到你的makefile
OBJECTS: timeout.c
$(CC) -c timeout.c