【问题标题】:Makefile adding libraries from others directoryMakefile 从其他目录添加库
【发布时间】:2020-08-28 14:17:07
【问题描述】:

我想为一个大型 C 项目创建一个 Makefile,文件分为多个目录。我写的是

CC              =  gcc
AR              =  ar
ARFLAGS         =  rvs
CFLAGS          += -std=c99 -Wall -g

INCDIR          = ./include
LIBDIR          = ./lib
SRCDIR          = ./src
BINDIR          = ./bin
OBJDIR          = ./obj
TESTDIR         = ./testfile

INCLUDES        = -I.
LDFLAGS         = -L/lib
LIBFUNCTIONS    = /-lfunctions
LIBTH           = -lpthread
LIBUTILITY      = /-lutility
OPTFLAGS        = -O3 -DNDEBUG

TARGETS         =   $(BINDIR)/test_functions        \

.PHONY: all clean cleanall test1 test2
.SUFFIXES: .c .h

$(BINDIR)/%: $(SRCDIR)/%.c
    $(CC) $(CFLAGS) $(INCLUDES) $(OPTFLAGS) -o $@ $<

$(OBJDIR)/%.o: $(SRCDIR)/%.c 
    $(CC) $(CFLAGS) $(INCLUDES) $(OPTFLAGS) -c -o $@ $<

all     : $(TARGETS)        

$(BINDIR)/test_functions: $(OBJDIR)/test_functions.o $(LIBDIR)/libutility.a $(LIBDIR)/libfunctions.a
    $(CC)  $(CFLAGS) $(INCLUDES) $(FLAGS) $(LDFLAGS) -o $@ $< $(LIBUTILITY) $(LIBFUNCTIONS)

$(OBJDIR)/test_functions.o: $(SRCDIR)/test_functions.c $(INCDIR)/utility.h $(LIBDIR)/libutility.a $(INCDIR)/functions.h $(LIBDIR)/libfunctions.a
        $(CC) $(CCFLAGS) $(INCLUDES) $(FLAGS) -c -o $@ $<           

$(LIBDIR)/libutility.a: $(OBJDIR)/utility.o $(INCDIR)/utility.h
    $(AR) $(ARFLAGS) $@ $<  

$(LIBDIR)/libfunctions.a: $(OBJDIR)/functions.o $(INCDIR)/functions.h $(INCDIR)/utility.h
    $(AR) $(ARFLAGS) $@ $<  


clean       : 
    rm -f $(TARGETS)

cleanall    : clean
    \rm -f *.o *~ 

问题是当我尝试使用makefile编译项目时,结果是

gcc  -std=c99 -Wall -g -I.  -L/lib -o bin/test_functions obj/test_functions.o -lutility -lfunctions
/usr/bin/ld: impossibile trovare -lutility
/usr/bin/ld: impossibile trovare -lfunctions
collect2: error: ld returned 1 exit status
make: *** [Makefile:54: bin/test_functions] Error 1

编译器似乎找不到这些库。我该怎么做才能让它正常工作?

【问题讨论】:

  • 您不需要使用-lutility-lfunctions,因为它们是静态库。此外,-L/lib 也不做任何事情,因为那是标准库路径。如果您要链接 ./lib 中的共享库,则需要 -l 选项和 -L./lib
  • 更多信息here

标签: c gcc makefile libraries


【解决方案1】:

你有这个:

LIBDIR          = ./lib

然后在你的链接行中你有这个:

LDFLAGS         = -L/lib

注意到区别了吗?

你为什么不直接说:

LDFLAGS = -L$(LIBDIR)

为了避免重复自己(并弄错)?

【讨论】:

    猜你喜欢
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    相关资源
    最近更新 更多