c - C Makefile 不适用于共享库
问题描述
我有一个名为ds
3 个子目录的目录: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)
解决方案
推荐阅读
- javascript - 使用 Javascript WinRT 将标头添加到 PlayReadyLicenseAcquisitionServiceRequest
- reactjs - 未能完成请求 - 连接被主机中的软件中止
- omnet++ - 如何让车辆停在路上1000秒?
- json - 如何在 WSO2 Enterprise Integrator 中处理 Json Formatters
- mongodb - 如果查询中的参数在 Mongodb 中为 null,则忽略该参数
- python - 如何将每个 HTML 页面的输出写入 Python 中的多个文件?
- pagespeed-insights - 为什么我不能在我的网页上检查我的网页速度?
- reactjs - 一起执行两个 POST 请求
- c - IPC:每秒从客户端收集数据
- c - 尝试删除链表的第一个节点时的奇怪行为