假设我有一个文件夹结构:
|
| - 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
如何通过我当前的设置以及可能的不同数量的目录/文件来实现这一目标。
答案 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 $@ $<
这将在与通过目录递归的源文件相同的目录中创建目标文件。