我的makefile中缺少什么?

时间:2013-08-23 16:44:56

标签: c makefile

我正在尝试创建我的第一个makefile。我使用以下命令测试了我的程序:

Command 1: gcc -Wall -ggdb3 -std=c99 -o file1 file1.c -lm -lpthread -l
Command 2: gcc -Wall -ggdb3 -std=c99 -o file2 file2.c -lm -lpthread

一切都很好。然后我创建了一个makefile(请参见下文)。我一直收到错误消息。有人可以看看我的代码,并给我一个关于问题的提示吗?

file2.o: In function `seed_primes':
file2.c:(.text+0x461): undefined reference to `sqrt'
file2.c:(.text+0x466): undefined reference to `sqrt'
file2:(.text+0x533): undefined reference to `sqrt'
file2.o: In function `create_threads':
file2.c:(.text+0x668): undefined reference to `pthread_create'
file2.c:(.text+0x6b5): undefined reference to `pthread_join'
file2.o: In function `next_seed':
file2.c:(.text+0x860): undefined reference to `sqrt'
collect2: ld returned 1 exit status
make: *** [file2] Error 1

这是我的makefile:

CC=gcc
DEBUG=-ggdb3
CFLAGS=#(DEBUG) -Wall -lm -lpthread -lrt -l

PROGS=file1 file2 

all: $(PROGS) 

file1: file1.o
    $(CC) $(CFLAGS) -o file1 file1.o 

file1.o: file1.c
    $(CC) $(CFLAGS) -c file1.c     

file2: file2.o
    $(CC) $(CFLAGS) -o file2 file2.o 

file2.o: file2.c
    $(CC) $(CFLAGS) -c file2.c  

clean:
    rm -f $(PROGS) *.o *~

2 个答案:

答案 0 :(得分:7)

由于#注释字符(您可能打算使用$代替),您已将CFLAGS设置为空字符串。

您不应将库设置为CFLAGS;它们属于LDLIBS

您不需要file1:规则,file2:规则或目标文件规则。

CC     = gcc
DEBUG  = -ggdb3
CFLAGS = $(DEBUG) -Wall
LDLIBS = -lm -lpthread -lrt -l

PROGS  = file1 file2 

all: $(PROGS) 

clean:
    rm -f $(PROGS) *.o *~

注意:LDLIBS和相关的LDFLAGSmake的变种中并非100%统一。 LDFLAGS应该用于库路径; LDLIBS用于库名称(-lxyz等)。

如果您需要为这两个程序使用不同的库,则需要创建单独的构建规则(如您原来的那样),或使用条件宏分配(GNU make)。

答案 1 :(得分:1)

您将所有标记放在CFLAGS中,这使得它们在命令行中的目标文件之前显示为。请注意,您的测试命令没有这样做。

更改你的旗帜:

CFLAGS=$(DEBUG) -Wall 
LDFLAGS=-lm -lpthread -lrt

然后在食谱中:

$(CC) $(CFLAGS) -o file1 file1.o $(LDFLAGS)