2
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

不知道我哪里出错了。

4

3 回答 3

2

您尚未指定如何构建目标 timeout.o。

您需要添加以下代码:

timeout.o: timeout.c
            $(CC) $(CFLAGS) -c -o $@ $<

如果您最终需要编译更多源文件,则可以使用如下模式匹配规则:

%.o: %.c
        $(CC) $(CFLAGS) -c $< -o $@
于 2013-01-31T04:44:55.720 回答
2

Makefile 可能有点棘手。因为您想继续向OBJECT变量添加更多对象,所以我实际上会添加一个先决条件以EXECUTABLE确保您的所有对象都已编译。从那里开始,自动规则推理应该负责其余的工作。

基本上将这一行替换为:

$(EXECUTABLE): $(OBJECTS)
        $(CC) -m32 -o $@ -Wl,-rpath,$(RUNTIME_PATH), $(LIB_PATH) $(OBJECTS) $(LIBS)
于 2013-01-31T04:53:55.217 回答
1

它显示错误,因为 make 无法在当前目录中找到 timeout.o 文件。如果您有 timeout.c 文件,则将以下内容添加到您的 makefile

OBJECTS: timeout.c

      $(CC) -c timeout.c
于 2013-01-31T04:47:08.480 回答