首页 > 解决方案 > C Makefile 不适用于共享库

问题描述

我有一个名为ds3 个子目录的目录:test, include & source.

ds
  \

  source
   \
        stack.c, queue.c, cbuffer.c

  include
   \
        stack.h, queue.h, cbuffer.h

  test
   \
        stack_test.c, queue_test.c, cbuffer_test.c

我需要创建一个Makfile构建ds文件夹中所有数据结构的目标。共享对象和每个练习的可执行测试文件链接并与共享对象一起运行。

.c所以我确实设法创建了一个测试文件,该文件创建了包含所有实现的共享库,这意味着它具有每个数据结构的每个功能(包括/ds/source/.

该库被调用libds.so并在目录中创建(也位于 该ds目录中。makefile图书馆创建

但问题是,当它达到为Targets每个_test.c文件编译共享库的方法时,它失败了。

gcc -ansi -pedantic-errors -Wall -Wextra -fpic -g -I./include/  -L. -lds ./test/cbuffer_test.o -o cbuffer
/usr/bin/ld: ./test/cbuffer_test.o: in function `main':
/home/jackmem/jack-mem/ds/test/cbuffer_test.c:36: undefined reference to `CBufferCreate'
/usr/bin/ld: ./test/cbuffer_test.o: in function `CBufferDestroyTest':
/home/jackmem/jack-mem/ds/test/cbuffer_test.c:59: undefined reference to `CBufferDestroy'
/usr/bin/ld: ./test/cbuffer_test.o: in function `CBufferWriteToTest':
/home/jackmem/jack-mem/ds/test/cbuffer_test.c:76: undefined reference to `CBufferWriteTo'
/usr/bin/ld: /home/jackmem/jack-mem/ds/test/cbuffer_test.c:79: undefined reference to `CBufferWriteTo'
/usr/bin/ld: /home/jackmem/jack-mem/ds/test/cbuffer_test.c:82: undefined reference to `CBufferReadFrom'
/usr/bin/ld: ./test/cbuffer_test.o: in function `CBufferReadFromTest':
/home/jackmem/jack-mem/ds/test/cbuffer_test.c:100: undefined reference to `CBufferReadFrom'
/usr/bin/ld: /home/jackmem/jack-mem/ds/test/cbuffer_test.c:103: undefined reference to `CBufferWriteTo'
/usr/bin/ld: /home/jackmem/jack-mem/ds/test/cbuffer_test.c:107: undefined reference to `CBufferReadFrom'
/usr/bin/ld: /home/jackmem/jack-mem/ds/test/cbuffer_test.c:111: undefined reference to `CBufferWriteTo'
/usr/bin/ld: /home/jackmem/jack-mem/ds/test/cbuffer_test.c:115: undefined reference to `CBufferReadFrom'
/usr/bin/ld: /home/jackmem/jack-mem/ds/test/cbuffer_test.c:130: undefined reference to `CBufferSize'
/usr/bin/ld: /home/jackmem/jack-mem/ds/test/cbuffer_test.c:130: undefined reference to `CBufferReadFrom'
/usr/bin/ld: ./test/cbuffer_test.o: in function `CBufferIsEmptyTest':
/home/jackmem/jack-mem/ds/test/cbuffer_test.c:138: undefined reference to `CBufferIsEmpty'

这不是特定问题,CBuffer因为我在没有共享库的情况下对其进行了测试,并且它可以编译和工作。由于某种原因,它无法到达图书馆。

这是我的makefile

#PATHS
SRCDIR=./source/
TSTDIR=./test/
OBJDIR=./obj/
HDRDIR=./include/
#vpaths
vpath %.h ./include/
vpath %.c ./test/
vpath %.c ./source/
vpath %.o ./obj/
#COMPILER
CC=gcc
CFLAGS=-ansi -pedantic-errors -Wall -Wextra -fpic -g -I$(HDRDIR) # C flags
LDFLAGS=-shared # linking flags
TARGET_LIB = libds.so  # target lib
#FILES
TESTS=$(wildcard ./test/*.c)
CFILESWP=$(patsubst %_test.c,%.c,$(TESTS))
SRCS=$(notdir $(CFILESWP))
TARGETS=$(patsubst %.c,%,$(SRCS))
OBJS=$(SRCS:.c=.o)


.PHONY: all
all: ${TARGET_LIB} $(TARGETS)

#CREATE EXECUTABLES
$(TARGETS): $(TESTS:.c=.o)
    $(CC) $(CFLAGS) -L. -lds $(TSTDIR)$@_test.o -o $@

$(SRCS:.c=.d):%.d:%.c
    $(CC) $(CFLAGS) -MM $< >$@
    
#CREATE A SHARED LIBRARY
$(TARGET_LIB): $(OBJS)
    $(CC) $(LDFLAGS) -o $@ $^
    
include $(SRCS:.c=.d)

#CLEAN
clean:
    rm -f ${TARGET_LIB} ${OBJS} $(SRCS:.c=.d)

标签: cmakefilecompiler-errorsshared-librariesheader-files

解决方案


推荐阅读