makefile中的多个可执行文件

时间:2011-11-12 23:44:37

标签: c linux gcc makefile

我正在尝试编写一个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

任何帮助将不胜感激!谢谢!

3 个答案:

答案 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撰写了一篇很好的教程。