这是我的源文件,但是在编译时,我得到了对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
答案 0 :(得分:1)
heapsort
和mergesort
不是C中标准库的一部分。您应该看一下具有这些功能的C ++编译器。
答案 1 :(得分:1)
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主机执行此操作。删除该支票。
答案 2 :(得分:1)
对于正在阅读 Zed A. Shaw 的 Learn C The Hard Way 一书的其他人,您也可以在 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 上使用的)。< /p>
在 darray_algos.c 中,您可能还需要替换:
#include <stdlib.h>
与:
#include <bsd/stdlib.h>
在编译时消除警告。