【问题标题】:linking error for mergesort() from the C standard library来自 C 标准库的 mergesort() 的链接错误
【发布时间】:2019-02-20 05:59:05
【问题描述】:

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

#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

【问题讨论】:

  • heapsortmergesort 定义在哪里?
  • mergesort() from the C standard library - C 标准库中没有 mergesort()。

标签: c linux makefile


【解决方案1】:

heapsortmergesort 不是 C 标准库的一部分。您应该查看具有这些功能的 C++ 编译器。

【讨论】:

  • 为什么?您不会在 C++ 中找到它们(嗯,有一个堆排序,但该算法有不同的名称......)。它们来自 *BSD libcs​​。
【解决方案2】:

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 主机都应该这样做。删除该检查。

【讨论】:

    【解决方案3】:

    对于正在阅读 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 上使用的)。

    在 darray_algos.c 中你可能还需要替换:

    #include <stdlib.h>
    

    与:

    #include <bsd/stdlib.h>
    

    在编译时消除警告。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 2020-05-14
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多