如何从特定的目标文件制作特定的二进制文件?

问题描述:

这里是我的生成文件,我在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] $< 
+0

您好,感谢您的答复,但任何的不正常工作,在第一种方式,我得到: 巨量诸如“(.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

+0

@Ikakok:对不起,我犯了一个错误。我会编辑我的答案。 – Beta 2013-04-09 14:49:08

+0

你好再次=)现在一切正常,非常感谢,如果你发现你帮助第二次=),但如果你不介意,你可以解释我怎么不写“$(NAMES):obj /% .o“(实际上我可以,但它给了我”没有规则blahblahblah“)$(NAMES)由bin/组成,为什么我应该直接写它? bin /%,是否有任何方法将符号“%”写入$(NAMES)?也许像$(%NAMES)这样的东西,或者给我一个链接(请指出,除了GNU makefile手册之外的任何链接(我的英语还不够好,无法在没有词汇的情况下*阅读) – Ikakok 2013-04-10 06:47:26