首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C标准库中mergesort()的链接错误

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

Stack Overflow用户
提问于 2019-02-20 13:59:05
回答 3查看 532关注 0票数 1

这是我的源文件,但当我编译它时,我得到了对mergesort的未定义引用。

代码语言:javascript
复制
#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

代码语言:javascript
复制
   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
EN

回答 3

Stack Overflow用户

发布于 2019-02-20 14:18:11

heapsort和mergesort不是C中标准库的一部分。您应该看看C++编译器才能拥有这些函数。

票数 1
EN

Stack Overflow用户

发布于 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中,你有:

代码语言:javascript
复制
OS=$(shell lsb_release -si)
ifeq ($(OS),Ubuntu)
    LDLIBS=-llcthw -lbsd -L./build -lm
endif

应该对所有安装了bsd包的linux主机执行此操作。去掉那张支票。

票数 1
EN

Stack Overflow用户

发布于 2021-03-27 05:59:10

对于任何正在阅读Zed A.Shaw的《学习C语言的艰难道路》一书的其他人来说,在makefile中,您还可以替换以下代码块:

代码语言:javascript
复制
OS=$(shell lsb_release -si)
ifeq ($(OS),Ubuntu)
    LDLIBS=-llcthw -lbsd -L./build -lm
endif

具有以下功能:

代码语言:javascript
复制
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中,您可能还需要替换:

代码语言:javascript
复制
#include <stdlib.h>

通过以下方式:

代码语言:javascript
复制
#include <bsd/stdlib.h>

来消除编译时的警告。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54779736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档