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 $@ $<