C语言 GCC 输出对象文件与源文件位于同一目录中



假设我有一个这样的文件夹结构:

|
| - src
|- file.c
|- folderOne
|- file2.c
|- file3.S
|- folderTwo
|-folderThree
|- file4.c

我目前有一个makefile,它将获取我所有的程序集和C文件,如下所示:

S_SRC  = $(wildcard *.S) $(wildcard **/*.S)
C_SRC  = $(wildcard *.c) $(wildcard **/*.c)
S_OBJS = $(patsubst %.S,%.o,$(filter %.S,$(S_SRC)))
C_OBJS = $(patsubst %.c,%.o,$(filter %.c,$(C_SRC)))
OBJS   = $(S_OBJS) $(C_OBJS)

这些行只是获取所有.c.S文件,并创建其等效.o值。我的管道正在源文件上运行 GCC,然后手动链接它们。

我使用以下语法运行 GCC:

$(OBJS): $(C_SRC) $(S_SRC)
$(CC) $(CC_F) $(S_SRC) $(C_SRC) -o $(OBJS)

我将源文件传递给 GCC 的地方。CC_F变量是我的标志变量:

CC_F   = -m32 -Wall -Wextra -Werror -g -c

之后我想像这样运行我的链接器:

$(PROGR): $(OBJS) $(LINK_SRC)
$(LD) $(LD_F) -o $(PROGR) $(OBJS)

同样,LD_F只是我的链接器标志。

我目前遇到的问题是,对于多个源文件,GCC 无法解析命令,输出如下内容:

gcc -m32 -Wall -Wextra -Werror -g -c  src/file1.S  src/file2.c -o src/file1.o src/file2.o
gcc: error: src/file2.o: No such file or directory

我希望能够做的是让 GCC 在与源文件相同的目录中输出每个源文件的目标文件。在给定的示例中,运行生成文件应生成此布局:

|
| - src
|- file.c
|- file.o
|- folderOne
|- file2.c
|- file2.o
|- file3.S
|- file3.o
|- folderTwo
|-folderThree
|- file4.c
|- file4.o

这在我当前的设置以及可能不同数量的目录/文件中如何实现。

gcc

不允许在一次调用中出现多个输出文件。您需要运行gcc与需要创建的目标文件数一样多的次数。

一个目标文件可能包含一个或多个已编译的源。

您需要从生成文件中删除此块:

$(OBJS): $(C_SRC) $(S_SRC)
$(CC) $(CC_F) $(S_SRC) $(C_SRC) -o $(OBJS)

假设每个源文件需要 1 个对象文件,请将其替换为:

**/%.o: **/%.c
$(CC) $(CC_F) -c -o $@ $<

这将在与源文件相同的目录中创建对象文件,递归地通过这些目录。

最新更新