这是我的源文件,但当我编译它时,我得到了对mergesort的未定义引用。
#include <lcthw/darray_algos.h>
#include <stdlib.h>
int DArray_qsort(DArray * array,DArray_compare cmp)
{
qsort(array->contents, DArray_count(array), sizeof(void *), cmp);
return 0;
}
int DArray_heapsort(DArray * array, DArray_compare cmp)
{
return heapsort(array->contents, DArray_count(array),
sizeof(void *), cmp);
}
int DArray_mergesort(DArray * array, DArray_compare cmp)
{
return mergesort(array->contents, DArray_count(array),
sizeof(void *), cmp);
}我不知道如何正确地链接stdlib排序函数我一直在使用这个通用的makefile,但它似乎没有通过stdlib
CFLAGS=-g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG $(OPTFLAGS)
LDFLAGS=$(OPTLIBS)
PREFIX?=/usr/local
SOURCES=$(wildcard src/**/*.c src/*.c)
OBJECTS=$(patsubst %.c,%.o,$(SOURCES))
TEST_SRC=$(wildcard tests/*_tests.c)
TESTS=$(patsubst %.c,%,$(TEST_SRC))
TARGET=build/liblcthw.a
OS=$(shell lsb_release -si)
ifeq ($(OS),Ubuntu)
LDLIBS=-llcthw -lbsd -L./build -lm
endif
# The Target Build
all: $(TARGET) tests
dev: CFLAGS=-g -Wall -Isrc -Wall -Wextra $(OPTFLAGS)
dev: all
$(TARGET): CFLAGS += -fPIC
$(TARGET): build $(OBJECTS)
ar rcs $@ $(OBJECTS)
ranlib $@
build:
@mkdir -p build
@mkdir -p bin发布于 2019-02-20 14:18:11
heapsort和mergesort不是C中标准库的一部分。您应该看看C++编译器才能拥有这些函数。
发布于 2019-02-20 14:33:32
mergesort() from the C standard library -C标准库中没有mergesort()。该函数不是来自the C standard library。
我在linux.die.net上找到了man mergesort,这表明该函数来自于BSD系统。所以你应该把你的程序和-lbsd联系起来。
在你的makefile中,你有:
OS=$(shell lsb_release -si)
ifeq ($(OS),Ubuntu)
LDLIBS=-llcthw -lbsd -L./build -lm
endif应该对所有安装了bsd包的linux主机执行此操作。去掉那张支票。
发布于 2021-03-27 05:59:10
对于任何正在阅读Zed A.Shaw的《学习C语言的艰难道路》一书的其他人来说,在makefile中,您还可以替换以下代码块:
OS=$(shell lsb_release -si)
ifeq ($(OS),Ubuntu)
LDLIBS=-llcthw -lbsd -L./build -lm
endif具有以下功能:
OS=$(shell uname -a)
ifeq (Linux,$(findstring Linux,$(OS)))
LDLIBS=-llcthw -lbsd -L./build -lm
endif它应该可以在任何Linux发行版上工作,而不会中断Mac上的makefile执行。发生这种情况的原因是Linux中的stdlib.h有一个快速排序的实现,但不是堆排序和合并排序的实现,所以应该使用BSD stdlib.h ( Shaw先生在他的Mac上使用的)。
在darray_algos.c中,您可能还需要替换:
#include <stdlib.h>通过以下方式:
#include <bsd/stdlib.h>来消除编译时的警告。
https://stackoverflow.com/questions/54779736
复制相似问题