C标准库中mergesort()的链接错误

时间:2019-02-20 05:59:05

标签: c linux makefile

这是我的源文件,但是在编译时,我得到了对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

3 个答案:

答案 0 :(得分:1)

heapsortmergesort不是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>

在编译时消除警告。