gpt4 book ai didi

c - 生成的文件名作为变量的输入

转载 作者:行者123 更新时间:2023-11-30 15:33:32 25 4
gpt4 key购买 nike

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

例如:OBJ_SRC=sum.c sub.c mul.c div.c 余数.c

当我创建一个库时,我喜欢这样:

libarithmatic.a: $(OBJ_SRC)
gcc -c $(OBJ_SRC) # creates sum.o sub.o..
ar rcs libarithmatic.a $(OBJS) #<--- problem @OBJS

如何存储gcc -c $(OBJ_SRC)的输出:add.o sub.o mul.o..(新创建/更新的文件名)到 OBJS 变量中?

最佳答案

通常的方法是 patsubst

OBJS=$(patsubst %.c,%.o,$(OBJ-SRC))

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

libarithmatic.a: $(OBJS)
ar rcs libarithmatic.a $(OBJS)

您可以输入 pattern rule用于编译 .c 文件,但如果您只是放入

%.o: %.c
gcc -c $<

你不必费心,因为这是隐含的。嗯,default implicit rule确实是

%.o: %.c
$(CC) $(CPPFLAGS) $(CFLAGS) -o $@ $<

哪里CC默认为合适的编译器,您可以覆盖它和 CPPFLAGSCFLAGS默认为空,您可以将它们设置为您想要用于编译的任何标志。 CPPFLAGS适用于 C 和 C++,CFLAGS仅适用于 C,CXXFLAGS仅适用于 C++(C++ 编译器是 CXX )。

<小时/>

顺便说一句,我建议查看 CMake ,支持为各种平台、IDE 和新的超快速生成构建文件 ninja 。对应CMakeLists.txt会像

一样微不足道
project(arithmatic)
add_library(arithmatic sum.c sub.c mul.c div.c remainder.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 $@ $<

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

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

关于c - 生成的文件名作为变量的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23649206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com