C 在多个目录和多个源中生成文件

C 在多个目录和多个源中生成文件,c,makefile,C,Makefile,我有一个小项目,目录结构如下: src/ game/ some srcs... platform/ sdl/ main.c Makefile engine.c engine.h Makefile 我计划在平台内有多个目录,我的目标是我的小项目的不同平台。根级别的Makefile只是一个助手:它允许我从根文件夹运行诸如“makeplatformname”、“makeplatformname clean”等内容 这是我的实际生成文件,位于平台

我有一个小项目,目录结构如下:

src/
  game/
    some srcs...
  platform/
    sdl/
      main.c
      Makefile
  engine.c
  engine.h
Makefile
我计划在平台内有多个目录,我的目标是我的小项目的不同平台。根级别的Makefile只是一个助手:它允许我从根文件夹运行诸如“makeplatformname”、“makeplatformname clean”等内容

这是我的实际生成文件,位于平台文件夹中:

TARGET = sdl-game
SRC_FOLDER = ../..
CC = gcc
CFLAGS = -g -Wall -DPLAT_SDL
LDFLAGS = -lm

OBJECTS = main.o \
        $(SRC_FOLDER)/engine.o \
        $(SRC_FOLDER)/game/game.o \
        $(SRC_FOLDER)/game/components.o

$(TARGET): $(OBJECTS)
    $(CC) -o $(TARGET) $(OBJECTS) $(CFLAGS) $(LDFLAGS)

clean:
    rm -rf $(SRC_FOLDER)/*.o
    rm -rf $(SRC_FOLDER)/game/*.o
    rm -rf $(SRC_FOLDER)/platform/sdl/*.o
    rm -rf $(SRC_FOLDER)/platform/sdl/sdl
问题是:我无法使用根级别的Makefile从platform/sdl文件夹外运行此操作:

null:
make -C src/platform/sdl -f Makefile

有什么想法吗?另外,如何将这些.o对象移动到“build/platform name”文件夹中?

永远不要调用其他目录中的Makefile;相反,在每个子目录中放置一个Makefile,并在项目的根目录中添加一个主Makefile,如下所示:

SHELL = /bin/bash

DIRS = subdir1 subdir2 ...

depend all clean ::
    @ for d in $(DIRS) ; do \
        (cd $$d && make $@) ;\
    done

但我不确定是否能回答您的问题?

如果我正确理解您的评论(“构建,基于根”),这应该可以满足您的要求:

...
OBJ_FOLDER = ../../../build
...

OBJECTS = $(OBJ_FOLDER)/main.o \
          $(OBJ_FOLDER)/engine.o \
          $(OBJ_FOLDER)/game.o \
          $(OBJ_FOLDER)/components.o

$(TARGET): $(OBJECTS)
    $(CC) -o $(TARGET) $(OBJECTS) $(CFLAGS) $(LDFLAGS)

vpath %.c $(SRC_FOLDER) $(SRC_FOLDER)/game

$(OBJECTS): $(OBJ_FOLDER/%.o : %.c
    $(CC) -o $@ $< $(CFLAGS)

clean:
    rm -rf $(OBJ_FOLDER)/*.o
    rm -rf sdl
。。。
OBJ_文件夹=../../../build
...
OBJECTS=$(OBJ_文件夹)/main.o\
$(OBJ_文件夹)/engine.o\
$(OBJ_文件夹)/game.o\
$(OBJ_文件夹)/components.o
$(目标):$(对象)
$(CC)-o$(目标)$(对象)$(CFLAGS)$(LDFLAGS)
vpath%.c$(SRC\u文件夹)$(SRC\u文件夹)/游戏
$(对象):$(对象文件夹/%.o:%.c
$(CC)-o$@$<$(CFLAGS)
清洁:
rm-rf$(OBJ_文件夹)/*.o
rm-rf sdl

你已经试过了吗?你可以将
CMakeLists.txt
放在每个源文件文件夹中,并通过
add_subdirectory()
将它们包含在你的根
CMakeLists.txt
中。是的,我试过了,但我更喜欢保持简单,只使用make。你说“我无法运行这个”。这意味着什么?如果失败了吗?错误是什么?它做的不是正确的事情吗?它做的是什么?为什么是错误的?如果你不解释什么不起作用,我们就无能为力。仅供参考,你永远不应该在makefile中直接使用
make
来运行另一个make。你应该始终使用
$(make)
变量。此外,此处不需要
-f Makefile
,因为默认情况下make将搜索
Makefile
。make[1]:输入目录
/dev/proj/src/platform/sdl'make[1]:***无规则生成目标
。/../engine.o',需要
sdl.Stop.make[1]:离开目录
/dev/proj/src/platform/sdl'make:**[sdl]错误2这应该是一个注释,而不是答案。的确,但示例无法放入注释;-)因为它确实调用了另一个目录中的makefile,所以该示例可能不值得拥有。这似乎是一个没有区别的区别。
cd-foo/&make
如何优于
make-C-foo/
?如何将对象文件移动到构建文件夹?我的.c文件是否需要SRC_列表?@vinnylinux:此makefile将在
build
文件夹中生成目标文件。但是它如何获取c文件?@vinnylinux:通过
vpath
实现。也许你应该问一个更简单的问题。