2012-01-25 34 views
2

我是新来的Makefile的东西,并要问一个关于Makefile文件的问题。假设我有两个单独的程序有自己的.c .h和main.c文件。没有任何程序被链接。是否有可能制作这种类型的程序的两个可执行文件?如果是这样,那怎么可能?我已经尝试过,但失败了,我得到了以下错误:Make文件有两个主要文件

/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crt1.o: In function `_start': 
(.text+0x18): undefined reference to `main' 
collect2: ld returned 1 exit status 

回答

6

在makefile中可以有多个目标。例如:

all: A B 

A: mainA.c 
    $(CC) -o [email protected] $^ 

B: mainB.c 
    $(CC) -o [email protected] $^ 

然后make A将建立一个唯一的,make B只会建B,和make all(或只是make)将建立两个。

+0

好,非常感谢这么多先生 – mainajaved

0

您需要两次打电话给你的链接,创建两个不同的节目。

在程序中,只有一个“主”可以存在。这个问题可能源自编译两个'.c'文件(每个文件都包含一个主文件)为两个'.o'文件,然后试图从'.o'文件中创建一个可执行文件。编译器的难题(这是不允许的)是“哪个主要开始”?

一个快速的方法来解决这个问题是电源分离成各自的“mainXXX.c”文件,然后确保只有一个“mainXXX.o”文件,每个输出可执行文件引用。其他解决方案也存在。制作一个适合您需求的产品。

2

如果两个程序有一个main.c文件,那么你必须将它们放置在两个单独的目录。然后,在每个目录中写入一个makefile,并在顶层目录中写入一个生成文件,该文件将递归到这两个子文件中。

/ 
    Makefile 
    prog0/ 
    Makefile 
    main.c 
    ... 
    prog1/ 
    Makefile 
    main.c 
    ... 

清零Prog0/Makefile文件看起来像这样:

all: prog0 
prog0: prog0.o 
    $(LINK.c) $(OUTPUT_OPTION) $^ 

重复的PROG1。然后,在父目录下,写一个递归的makefile:

all: 
    $(MAKE) --directory prog0 all 
    $(MAKE) --directory prog1 all