我是Makefile的新手,想问一个关于Makefiles的问题。假设我有两个独立的程序,它们有自己的.c .h和main.c文件。没有任何程序链接。有可能制作这种程序的两个可执行文件吗?如果是这样,怎么可能?我试过这个但它失败了,我得到了以下错误:
/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
答案 0 :(得分:7)
在您的makefile中,您可以拥有多个目标。例如:
all: A B
A: mainA.c
$(CC) -o $@ $^
B: mainB.c
$(CC) -o $@ $^
然后make A
只会构建A,make B
只会构建B,而make all
(或只是make
)会构建两者。
答案 1 :(得分:2)
如果两个程序有一个main.c文件,那么你必须将它们放在两个单独的目录中。然后,在每个目录中编写一个makefile,在顶层目录中编写一个makefile,将其复制到这两个子makefiles中。
/
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
答案 2 :(得分:0)
您需要两次调用链接器,以创建两个不同的程序。
在程序中,只能存在一个“main”。问题可能源于将两个“.c”文件(每个包含一个主文件)编译成两个“.o”文件,然后尝试用两个“.o”文件创建一个可执行文件。编译器的难题(不允许)是“哪个主要开头”?
解决此问题的一种快速方法是将主电源分离为相应的“mainXXX.c”文件,然后确保每个输出可执行文件仅引用一个“mainXXX.o”文件。其他解决方案也存在。制作一个适合您需求的产品。