ошибка связывания clang: неопределенная ссылка на «qsort»

Несмотря на то, что я включил '#include' в свой код, когда я использую встроенную функцию qsort, clang выдает мне ошибку:

schedule.o: In function `chooseTicket':
schedule.c:(.text+0x16d): undefined reference to `qsort'
clang: error: linker command failed with exit code 1 (use -v to see invocation)

начало файла (schedule.c) выглядит так:

#include "sched.h"
#include "schedproc.h"
#include <assert.h>
#include <minix/com.h>
#include <machine/archtypes.h>
#include <stdlib.h>
#include <lib.h>
#include <string.h>
#include <time.h>

а вот функция, в которой я использовал встроенную функцию qsort

int chooseTicket(int* ticketList,int length,int totalTicket){
        int randomValue;
        int temp=0,prevTemp=0,selectedTicket=0,selectedIndex = 0;
        time_t t;
        struct schedproc *rmp;
        int* sortedTicketList = malloc(length*sizeof(int));
        memcpy(sortedTicketList,ticketList,length);
        srandom((unsigned)time(&t));
        randomValue = (random() % totalTicket);
        qsort(sortedTicketList,length,sizeof(int),cmpFunc);//this line

примечание: те же ошибки также возникали для функций «rand ()» и «srand ()», и вместо этого я использовал «random ()» и «srandom ()», после чего проблема была решена. Я не понимаю, несмотря на то, что 'rand()' и 'srand()' являются общепринятыми функциями и заголовочный файл содержит эти функции, почему clang выдает мне ошибки связывания, когда я использую 'rand()' и 'srand( ).


person ffguven    schedule 16.12.2016    source источник
comment
В сторону: переместите srandom((unsigned)time(&t)); в main(). Вы должны заполнить ГСЧ только один раз.   -  person Weather Vane    schedule 16.12.2016
comment
Можете ли вы показать команду clang, которую вы используете для сборки своего программного обеспечения?   -  person chrisaycock    schedule 16.12.2016
comment
Как вы компилировали и связывали свой код?   -  person e0k    schedule 16.12.2016
comment
поскольку я работаю над операционной системой minix, а функция main() находится в ядре, интеграция этой функции в main.c ядра очень сложна. мне нужно сделать это в этой функции.   -  person ffguven    schedule 16.12.2016
comment
я просто использую «make hdboot» в пути «/usr/src/releasetools» в minix. Прошу прощения, что не рассказал об этой миникс-детали. Я собираюсь добавить это к вопросу. но я думаю, что проблема в clang, а не в миниксе.   -  person ffguven    schedule 16.12.2016
comment
Перемещение больше не по теме, извините: переместите вызов srandom() на то, что у вас есть в качестве функции init. Хуже всего — заполнять ГСЧ каждый раз, когда вам нужно случайное число.   -  person Weather Vane    schedule 16.12.2016
comment
я не уверен, можно ли посеять 'srand()' в любой части огромного кода, а затем использовать 'rand()' без повторного заполнения 'srand()' повсюду. потому что примерно 20 000 строк кода работают над ядром   -  person ffguven    schedule 16.12.2016
comment
ОП: Вы отправили вопрос, связанный с minix Прекратите использовать SO как средство, помогающее вам в отладке, это не то, о чем SO.   -  person t0mm13b    schedule 16.12.2016
comment
Затем поместите static int seeded = 0; в функцию random() и сделайте посев зависимым от этого.   -  person Weather Vane    schedule 16.12.2016
comment
Ядро, будь то для Linux, MINix, BSD, Solaris, AIX, Windows или любой другой системы, не обязательно предоставляет все функции, предоставляемые в «размещенной реализации» (например, предоставляемые вне ядра во всех этих системах). Вы должны знать, какие функции предоставляет ваше ядро. Вы должны избегать использования функций, которые не предоставляются, или организовать (частную?) реализацию функции, которая будет доступна.   -  person Jonathan Leffler    schedule 16.12.2016
comment
Среды ядра обычно не используют полную стандартную библиотеку C. Это автономные реализации. Интересно, как вам удается иметь malloc.   -  person n. 1.8e9-where's-my-share m.    schedule 16.12.2016
comment
спасибо за ваш ценный комментарий г-н Леффлер. я подумаю об этом.   -  person ffguven    schedule 16.12.2016


Ответы (1)


Во-первых, qsort является не встроенным, а частью Стандартная библиотека C (формально для размещенных сред.)

Во-вторых, вам нужно знать, что #include разрешает доступ только к объявлениям функций в любой данной библиотеке. Вам нужно связать с библиотекой, чтобы ваша программа фактически выполняла вызов функциональности. Поскольку здесь вы получаете ошибку компоновщика, никакие #include не помогут.

Я предполагаю, что вы пишете службу MINIX, поэтому связываетесь с libminc, а не с полной стандартной библиотекой ("libc"); другими словами, это автономная среда. А бывает, что qsort() нет в ограниченном наборе функций C включен в libminc.

Либо ссылка с qsort.(c|o) конкретно; или расширить собственную локальную версию libminc, включив в нее qsort(); или съесть весь торт и связать с полным libc, возможно, добавив DPADD+= ${LIBC}; LDADD+= -lc к Makefile (я никогда не пытался сделать это, но в какой-то момент это должно было сработать, в соответствии с кодом ; это не обычная практика, так что ждите проблем в будущем.)

person AntoineL    schedule 02.01.2017