我正在尝试编写一个makefile,它将编译一个用c。
编写的简单模拟实时操作系统目录结构看起来像这样
**KB**
SOURCE
-------
- Keyboard.c (helper process)
Incl
--------
- Include files needed by keyboard.c
**CRT**
SOURCE
-------
- crt.c (helper process)
Incl
--------
- Include files needed by crt.c
**RTX**
SOURCE
-------
- SOURCE Files
INCLUDE
--------
- Include Files
**KB**
SOURCE
-------
- Keyboard.c (helper process)
Incl
--------
- Include files needed by keyboard.c
**CRT**
SOURCE
-------
- crt.c (helper process)
Incl
--------
- Include files needed by crt.c
**RTX**
SOURCE
-------
- SOURCE Files
INCLUDE
--------
- Include Files
RTX要求将帮助程序进程编译成两个可执行文件,然后使用这些可执行文件运行。
我不知道如何在同一个Makefile中生成三个不同的可执行文件,甚至不知道如何将文件包含在一个可执行文件的不同包含文件中。我之前从未创建过makefile,并且在线教程后遇到了问题。
以下是我到目前为止RTX的内容(如何添加不同的路径?)
#For RTX Exexutable
OBJS = api.o init_table.o k_rtx.o msg.o pcb.o queue.o user_proc.o main.o
iRTX-G29 : $(OBJS)
gcc -o iRTX-G29 $(OBJS)
api.o : api.h
gcc -c api.c
init_table.o : init_table.h
gcc -c init_table.c
k_rtx.o : unistd.h string.h k_rtx.h
gcc -c k_rtx.c
main.o : fcntl.h sys/mman.h sys/wait.h stdio.h stdio.h sys/types.h sys/ipc.h sys/shm.h errno.h string.h stdlib.h signal.h k_rtx.h buffer.h global.h
gcc -c main.c
msg.o : msg.h
gcc -c msg.c
queue.o : queue.h
gcc -c queue.c
user_proc.o : user_proc.h
gcc -c user_proc.c
任何帮助将不胜感激!谢谢!
答案 0 :(得分:4)
首先让我们简化你现有的makefile。您有许多具有相同形式的对象规则:
msg.o : msg.h
gcc -c msg.c
更清晰的写作方式是这样的:
msg.o : msg.c msg.h
gcc -c $< -o $@
(我添加了依赖项msg.c
,输入了一些automatic variables并指定了输出的名称。)现在所有这些对象规则看起来都很相似,我们可以创建一个{{3为此,我现在将分离标头依赖项,因为main.o
不依赖于main.h
:
api.o : api.h
init_table.o : init_table.h
k_rtx.o : unistd.h string.h k_rtx.h
main.o : fcntl.h sys/mman.h sys/wait.h stdio.h stdio.h sys/types.h sys/ipc.h sys/shm.h errno.h string.h stdlib.h signal.h k_rtx.h buffer.h global.h
msg.o : msg.h
queue.o : queue.h
user_proc.o : user_proc.h
%.o : %.c
gcc -c $< -o $@
这些对象中的大多数都具有标头依赖关系,因此我们可以将它们分开并使其缩短:
api.o init_table.o k_rtx.o msg.o queue.o user_proc.o : %.o : %.h
k_rtx.o : unistd.h string.h
main.o : fcntl.h sys/mman.h sys/wait.h stdio.h stdio.h sys/types.h sys/ipc.h sys/shm.h errno.h string.h stdlib.h signal.h k_rtx.h buffer.h global.h
%.o : %.c
gcc -c $< -o $@
这将在RTX /中工作,但是为了让它在父目录中执行时起作用,我们必须改变一些事情。我假设存在文件名冲突的危险(即RTX /中有main.c
,CRT /中有不同的 main.c
,所以我们不能得到main.o
混淆了。因此,让我们将RTX目标文件保存在RTX /中(为了方便起见,我将main.o
从对象列表中取出,并省略sys/***
依赖项,因为我不知道你保留在哪里{{1 }})。这个答案变得越来越长,所以我将折叠其他可执行文件和一个主目标来构建它们:
sys/
答案 1 :(得分:1)
在makefile中,您可以编写与真实文件不对应的目标:
all: executable1 executable2
executable1: a.o b.o
<TAB HERE>gcc -o $@ $^
executable2: c.o d.o
<TAB HERE>gcc -o $@ $^
答案 2 :(得分:0)
我不知道如何在同一个Makefile中生成三个不同的可执行文件,甚至不知道如何将文件包含在不同的包含文件中,甚至包括一个可执行文件。
这是开始使用automake的最佳时机。 Sarah George撰写了一篇很好的教程。