如何从特定的目标文件制作特定的二进制文件?
问题描述:
这里是我的生成文件,我在obj /目录中有目标文件,我需要将它们编译成bin /文件夹中的二进制文件,但不知何故,它不工作,因为我想它工作,任何想法?如何从特定的目标文件制作特定的二进制文件?
SOURCES= $(wildcard *.c)
OBJECTS:= $(patsubst %.c, %.o, $(SOURCES))
OBJECTS:= $(addprefix obj/,$(OBJECTS))
NAMES:= $(patsubst %.c, %, $(SOURCES))
NAMES:= $(addprefix bin/,$(NAMES))
CC=gcc
CFLAGS= -Wall -c -o
DIRS = bin obj
all: $(DIRS) $(NAMES)
$(NAMES): $(OBJECTS)
$(CC) -o [email protected] $<
obj/%.o: %.c
$(CC) $(CFLAGS) [email protected] $<
$(DIRS):
mkdir -p [email protected]
clean:
rm -rf $(DIRS)
实际输出:
mkdir -p bin
mkdir -p obj
gcc -Wall -c -o obj/task1.o task1.c
gcc -Wall -c -o obj/task2.o task2.c
gcc -Wall -c -o obj/task3.o task3.c
gcc -o bin/task1 obj/task1.o
gcc -o bin/task2 obj/task1.o
gcc -o bin/task3 obj/task1.o
预期输出:
mkdir -p bin
mkdir -p obj
gcc -Wall -c -o obj/task1.o task1.c
gcc -Wall -c -o obj/task2.o task2.c
gcc -Wall -c -o obj/task3.o task3.c
gcc -o bin/task1 obj/task1.o
gcc -o bin/task2 obj/task2.o
gcc -o bin/task3 obj/task3.o
答
在此规则中:
$(NAMES): $(OBJECTS)
$(CC) -o [email protected] $<
每个可执行取决于全部物体。而且由于$<
仅抓取第一个先决条件,所有您看到的是obj/task1.o
。
这样来做:
bin/%: obj/%.o
$(CC) -o [email protected] $<
或者这样说:
$(NAMES): bin/% : obj/%.o
$(CC) -o [email protected] $<
您好,感谢您的答复,但任何的不正常工作,在第一种方式,我得到: 巨量诸如“(.init + 0x0)之类的行:_init'的多重定义 /usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5.2/../../../ crti.o :(.init + 0x0):首先在这里定义“ 和第二: “gcc -o bin/task1 gcc:没有输入文件” – Ikakok 2013-04-09 06:44:14
@Ikakok:对不起,我犯了一个错误。我会编辑我的答案。 – Beta 2013-04-09 14:49:08
你好再次=)现在一切正常,非常感谢,如果你发现你帮助第二次=),但如果你不介意,你可以解释我怎么不写“$(NAMES):obj /% .o“(实际上我可以,但它给了我”没有规则blahblahblah“)$(NAMES)由bin/组成,为什么我应该直接写它? bin /%,是否有任何方法将符号“%”写入$(NAMES)?也许像$(%NAMES)这样的东西,或者给我一个链接(请指出,除了GNU makefile手册之外的任何链接(我的英语还不够好,无法在没有词汇的情况下自由阅读) –
Ikakok
2013-04-10 06:47:26