ant*_*009 24 makefile gnu-make
GNU Make 3.82
gcc 4.7.2
c89
Run Code Online (Sandbox Code Playgroud)
我有以下make文件:
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 {} \;
Run Code Online (Sandbox Code Playgroud)
我的目录结构是这样的project/src project/bin.我的Makefile在project (root)文件夹中,我的所有*.h和*.c都在src目录中.目前我只有一个名为timeout.c的源文件
我收到此错误:
gcc: error: src/timeout.o: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我用它来获取所有源文件:
SOURCES=$(wildcard src/*.c)
Run Code Online (Sandbox Code Playgroud)
和目标文件:
OBJECTS=$(patsubst %.c, %.o, $(SOURCES))
Run Code Online (Sandbox Code Playgroud)
但是,make似乎在Makefile所在的项目根文件夹中创建了目标文件.它不应该把它放在src目录中吗?
Bet*_*eta 19
你在这个规则中有两个问题(好吧,三个):
$(OBJECTS): $(SOURCES)
$(CC) $(CFLAGS) -c $(SOURCES) $(LIB_PATH) $(LIBS)
Run Code Online (Sandbox Code Playgroud)
您还没有注意到,但规则使每个对象都依赖于所有源,并尝试以这种方式构建.只要您只有一个来源就没问题.使用静态模式规则和自动变量轻松修复:
$(OBJECTS): src/%.o : src/%.c
$(CC) $(CFLAGS) -c $< $(LIB_PATH) $(LIBS)
Run Code Online (Sandbox Code Playgroud)
此外,命令("$(CC)...")没有指定输出文件名,因此gcc将从源文件名中推断出它; 如果你给它src/timeout.c,它将产生timeout.o(在工作目录中project/).因此,您应指定输出文件的所需路径.使用另一个自动变量很容易:
$(OBJECTS): src/%.o : src/%.c
$(CC) $(CFLAGS) -c $< $(LIB_PATH) $(LIBS) -o $@
Run Code Online (Sandbox Code Playgroud)
使用gcc的-o选项可将输出文件到特定位置。例如,您可以说:
$(CC) $(CFLAGS) -c $(SOURCES) $(LIB_PATH) $(LIBS) -o $(OBJECTS)
Run Code Online (Sandbox Code Playgroud)
不幸的是,这行有一个问题:如果中的源文件不止一个$(SOURCES),它将不起作用,因为它还将$(OBJECTS)包含多个文件名,并且-o选项仅绑定到第一个参数。
编译源代码文件列表中的每个文件的一种方法是使用隐式规则。在中gmake,您将输入:
$(EXECUTABLE): $(OBJECTS)
$(CC) $(CFLAGS) -o $@ $(RUNTIME_PATH) $(OBJECTS) $(LIB_PATH) $(LIBS)
%.o : %.c
$(CC) $(CFLAGS) -c $< -o $@
Run Code Online (Sandbox Code Playgroud)
其中$ <被替换为输入文件的名称,$ @被替换为输出文件的名称。
| 归档时间: |
|
| 查看次数: |
69153 次 |
| 最近记录: |