C 作为变量输入的结果文件名

C 作为变量输入的结果文件名,c,makefile,C,Makefile,我在不同的文件中有许多函数 例如:OBJ_SRC=sum.c sub.c mul.c div.c rements.c 创建库时,我会这样做: libarithmatic.a: $(OBJ_SRC) gcc -c $(OBJ_SRC) # creates sum.o sub.o.. ar rcs libarithmatic.a $(OBJS) #<--- problem @OBJS libarithmatic.a:$(OBJ_SRC) gcc-c$(OBJ_SRC)

我在不同的文件中有许多函数

例如:
OBJ_SRC=sum.c sub.c mul.c div.c rements.c

创建库时,我会这样做:

libarithmatic.a: $(OBJ_SRC)
     gcc -c $(OBJ_SRC)  # creates sum.o sub.o.. 
     ar rcs libarithmatic.a $(OBJS) #<--- problem @OBJS
libarithmatic.a:$(OBJ_SRC)
gcc-c$(OBJ_SRC)#创建sum.o sub.o。。
ar rcs libarithmatic.a$(OBJS)#通常的方法是

现在调用gcc作为构建库的目标的一部分是一个坏主意。它完全忽略了使用make的要点,因为您要求gcc盲目地重新编译所有对象,而不是让make查找已更改的对象。通常的规则是:

libarithmatic.a: $(OBJS)
        ar rcs libarithmatic.a $(OBJS)
您可以输入用于编译.c文件的

%.o: %.c
        gcc -c $<
让它成为一个共享库,就像在需要时添加
shared
关键字一样简单


请注意,
%
占位符不必位于开头。如果要将对象放在与源不同的目录中,可以编写如下内容

OBJS=$(patsubst src/%.c,obj/%.o,$(SOURCES))
(在这种情况下,源必须与目录前缀一起列出)或者

OBJS=$(patsubst %.c,.objs/%.o,$(SOURCES))
同样,你也可以在规则中使用这个模式

obj/%.o: src/%.c
        mkdir -p obj
        $(CC) $(CPPFLAGS) $(CFLAGS) -o $@ $<
obj/%.o:src/%.c
mkdir-p obj
$(CC)$(CPPFLAGS)$(CFLAGS)-o$@$<

.objs/%.o:%.c
mkdir-p.objs
$(CC)$(CPPFLAGS)$(CFLAGS)-o$@$<

您必须确保输出目录存在,因为编译器不会创建它(因此我在规则中包括
mkdir
),并且您必须明确指定编译器输出,否则它将在当前目录中创建它。

如果我想在其他目录中创建
.o
s,那么该怎么办?我可以添加
mv$(OBJS)吗/objfiles/
makefile中的行?@SGG:
mv
对您帮助不大,因为make需要知道创建了哪些文件才能完成它的工作。我已经添加了模式如何添加或替换目录前缀的示例。我已经尝试过了。但给出了错误:
make:**没有规则生成'libarith.a'所需的目标'objs/add.o'。
@SGG:很可能您在某个地方有不匹配的地方。您可以尝试调试选项
make
,查看它尝试了哪些规则。如果你不能让它工作,那就另问一个问题。
OBJS=$(patsubst src/%.c,obj/%.o,$(SOURCES))
OBJS=$(patsubst %.c,.objs/%.o,$(SOURCES))
obj/%.o: src/%.c
        mkdir -p obj
        $(CC) $(CPPFLAGS) $(CFLAGS) -o $@ $<
.objs/%.o: %.c
        mkdir -p .objs
        $(CC) $(CPPFLAGS) $(CFLAGS) -o $@ $<