1

我正在尝试创建我的第一个 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

这是我的生成文件:

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 *~
4

2 回答 2

7

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

您不应该将库设置为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并且相关LDFLAGS的变体并不是 100% 统一的makeLDFLAGS应该用于库路径;LDLIBS用于库名称(-lxyz等)。

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

于 2013-08-23T16:48:41.367 回答
1

您将所有标志放入CFLAGS其中,使它们出现在命令行中的目标文件之前。请注意,您的测试命令没有这样做。

更改您的标志:

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

然后在食谱中:

$(CC) $(CFLAGS) -o file1 file1.o $(LDFLAGS)
于 2013-08-23T16:48:07.093 回答