与源文件在同一目录中的GCC输出对象文件

时间:2017-03-24 01:05:11

标签: c gcc makefile

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

|
| - 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在与源文件相同的目录中输出每个源文件的目标文件。在给定的示例中,运行makefile应该导致此布局:

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

如何通过我当前的设置以及可能的不同数量的目录/文件来实现这一目标。

1 个答案:

答案 0 :(得分:0)

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

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

您需要从Makefile中删除此块:

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

假设您想为每个源文件提供1个目标文件,请将其替换为:

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

这将在与通过目录递归的源文件相同的目录中创建目标文件。