-lpthread在C Makefile中的位置

-lpthread在C Makefile中的位置,c,makefile,C,Makefile,我对C语言中的Makefiles非常陌生。我正试图找出在我的makefile中放置-lpthread的位置,以便在我的C程序中实现posix线程。下面是我的Makefile,提前谢谢 CFLAGS = -g -Wall LDFLAGS = CC = gcc LD = gcc TARG1 = calc OBJS1 = calc.o $(TARG1): $(OBJS1) $(LD) $(LDFLAGS) $(OBJS1) -o $(TARG1) clean

我对C语言中的Makefiles非常陌生。我正试图找出在我的makefile中放置-lpthread的位置,以便在我的C程序中实现posix线程。下面是我的Makefile,提前谢谢

CFLAGS  = -g -Wall
LDFLAGS =
CC      = gcc
LD      = gcc

TARG1   = calc
OBJS1   = calc.o


$(TARG1): $(OBJS1)
    $(LD) $(LDFLAGS) $(OBJS1) -o $(TARG1)
clean:
    rm -rf $(TARG1) $(OBJS1)

我建议不要使用
-l
。相反,在CFLAGS和LDFLAGS变量上都给出GCC
-pthread
。这将确保在编译期间正确设置预处理器定义,并链接正确的库


这当然是假设GCC。如果使用英特尔icc或LLVM,请检查参数是否正确。

我建议不要使用
-l
。相反,在CFLAGS和LDFLAGS变量上都给出GCC
-pthread
。这将确保在编译期间正确设置预处理器定义,并链接正确的库


这当然是假设GCC。如果使用英特尔icc或LLVM,请检查参数是否正确。

我建议不要使用
-l
。相反,在CFLAGS和LDFLAGS变量上都给出GCC
-pthread
。这将确保在编译期间正确设置预处理器定义,并链接正确的库


这当然是假设GCC。如果使用英特尔icc或LLVM,请检查参数是否正确。

我建议不要使用
-l
。相反,在CFLAGS和LDFLAGS变量上都给出GCC
-pthread
。这将确保在编译期间正确设置预处理器定义,并链接正确的库


这当然是假设GCC。如果使用Intel icc或LLVM,请检查正确的参数。

通常在末尾的ld行上。因此,ld行将是$(ld)$(LDFLAGS)$(OBJS1)-o$(TARG1)-lpthread?Zan的回答是一个更好的解决方案,并涵盖了编译和链接期间需要指定标志的一般情况。通常,您应该尽可能在makefiles中使用变量,以防止重复和潜在错误。@user1153018在静态libs的情况下,链接器仅从定义当前未解析符号的lib中提取这些对象文件。这就是为什么您必须将库放在对象之后,在它们之前没有任何未解析的符号(除了main(),可能),因此没有任何东西会被链接。通常在ld行的末尾。因此ld行将是$(ld)$(LDFLAGS)$(OBJS1)-o$(TARG1)-lpthread?Zan的答案是更好的解决方案,并介绍了编译和链接期间需要指定标志的一般情况。通常,您应该尽可能在makefiles中使用变量,以防止重复和潜在错误。@user1153018在静态libs的情况下,链接器仅从定义当前未解析符号的lib中提取这些对象文件。这就是为什么您必须将库放在对象之后,在它们之前没有任何未解析的符号(除了main(),可能),因此没有任何东西会被链接。通常在ld行的末尾。因此ld行将是$(ld)$(LDFLAGS)$(OBJS1)-o$(TARG1)-lpthread?Zan的答案是更好的解决方案,并介绍了编译和链接期间需要指定标志的一般情况。通常,您应该尽可能在makefiles中使用变量,以防止重复和潜在错误。@user1153018在静态libs的情况下,链接器仅从定义当前未解析符号的lib中提取这些对象文件。这就是为什么您必须将库放在对象之后,在它们之前没有任何未解析的符号(除了main(),可能),因此没有任何东西会被链接。通常在ld行的末尾。因此ld行将是$(ld)$(LDFLAGS)$(OBJS1)-o$(TARG1)-lpthread?Zan的答案是更好的解决方案,并介绍了编译和链接期间需要指定标志的一般情况。通常,您应该尽可能在makefiles中使用变量,以防止重复和潜在错误。@user1153018在静态libs的情况下,链接器仅从定义当前未解析符号的lib中提取这些对象文件。这就是为什么必须将库放在对象之后,在它们之前没有任何未解析的符号(可能除了main()),因此不会链接任何对象。