c - 使用 makefile 将目标文件放入新目录时遇到问题

标签 c gcc makefile gnu-make

我是新手。到目前为止,我已经使用在线找到的一些 GNU 手册和教程成功地创建了以下内容。我想让 make 将所有创建的目标文件放入目录“obj”中。我已经能够成功地创建这个目录,但我不知道如何将文件放入其中。任何建议或提示表示赞赏。另外,一般来说,除了 GNU 文档之外,是否还有学习如何使用 make 的良好来源?

# specify compiler
CC          := gcc
# set compiler flags
CFLAGS      := -M -Igen/display -Igen/logic -Iman -Ilib/include -pipe -march=native -ftime-report
# set linker flags
LDFLAGS     := -lglut32 -loglx -lopengl32 -Llib
# specify separate directory for objects
OBJDIR      := obj
# include all sources
SOURCES     := $(wildcard gen/display/*.c gen/logic/*.c man/*.c)
# create objects from the source files
OBJECTS     := $(patsubst %.c,%.o,$(SOURCES)) 
# specify the name and the output directory of executable
EXECUTABLE  := win32/demo

# all isn't a real file
all: $(EXECUTABLE)

# compile
%.o: %.c
    @mkdir -p $(@D)
    $(CC) $(CFLAGS) -c $< -o $(OBJDIR)/$@   

# link
$(EXECUTABLE): $(OBJECTS)
    $(CC) $^ $(LDFLAGS) -o $@

# clean objects
clean:
    @$(RM) -rf $(OBJDIR)

.PHONY: all clean

最佳答案

只要您看到生成的输出没有转到文件 $@ 的规则,您就知道这是不对的。 Make 会将 $@ 自动变量设置为它希望创建的文件名,如果配方做了一些不同的事情,makefile 将不起作用。

您的规则将文件发送到 $(OBJDIR)/$@,而不是 $@,所以这是不对的。

因此,您需要像这样编写您的模式规则:

%.o: %.c
        @mkdir -p $(@D)
        $(CC) $(CFLAGS) -c $< -o $@

如果这不起作用,您将需要提供更多信息,例如编译行 make 调用的示例、您看到的错误等。

关于c - 使用 makefile 将目标文件放入新目录时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55928551/

相关文章:

c++ - 文件打开追加效率随文件大小而降低

c - 使用 dup2 和 printf 写入文件时遇到麻烦

c - enum_is_int 选项

c - 如何在 makefile 中组织大量 header 包含路径?

c - gcc 的 __attribute__((packed))/#pragma pack 不安全吗?

包含 header 的 C++ 错误

c - 听(): invalid argument

c - c 如何计算包含前缀增量的表达式?

编译器错误导致 execve 失败?

c++ - 为什么模板中的 static_assert 使用等效表达式会给我不同的结果?