2016-12-16 5 views
0

Malgré le fait que j'inclus « #include » à mon code, quand j'utiliser la fonction qsort intégrée, clang me donne l'erreur:clang erreur liant: référence non défini à « qsort »

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) 

début du fichier (schedule.c) est comme ça:

#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> 

et est ici la fonction dans laquelle je l'ai utilisé qsort fonction intégrée

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 

note: Même erreur pour la fonction 'rand()' et 'srand()' et j'ai utilisé 'random()' et 'srandom()', le problème a été résolu. Je ne comprends pas malgré le fait que 'rand()' et 'srand()' sont des fonctions généralement acceptées et le fichier d'en-tête contient ces fonctions, pourquoi clang me donne des erreurs de liaison alors que j'utilise 'rand()' et 'srand).

+1

en plus:.. vous déplacer en srandom ((non signé) temps (&t)); 'à' main() 'Vous devez semer le RNG une seule fois –

+1

double possible de [Qu'est-ce qu'une erreur de symbole de référence externe non défini/non résolu et comment puis-je résoudre ce problème?] (http://stackoverflow.com/questions/12573816/what-is-an-defined-reference-unresolved-external-symbol-error-and-how-do-i-fix) –

+0

Can vous montrez la commande clang que vous utilisez pour construire votre logiciel? – chrisaycock

Répondre

0

D'abord, qsort n'est pas un built-in, mais une partie de la C standard library (officiellement, pour les environnements hébergés.)

Deuxièmement, vous avez besoin d'apprendre que #include ne permet d'accéder aux déclarations des fonctions dans une bibliothèque donnée . Vous devez créer un lien avec la bibliothèque, pour que votre programme exécute réellement l'appel à la fonctionnalité. Puisque vous obtenez une erreur linker ici, pas #include vont aider.

Je suppose que vous écrivez un service MINIX, par conséquent liant avec libminc plutôt qu'avec la bibliothèque standard complète ("libc"); en d'autres termes, il s'agit d'un environnement autonome. Et il arrive qsort() n'est pas dans l'ensemble restreint de fonctions C included in libminc.

Soit un lien avec qsort.(c|o) spécifiquement; ou développez votre propre version locale de libminc pour inclure qsort(); ou manger tout le gâteau et le lien avec plein libc, peut-être en ajoutant DPADD+= ${LIBC}; LDADD+= -lc au Makefile(Je n'ai jamais essayé de le faire, mais il était censé fonctionner à un certain point, according to the code, ce n'est pas la pratique habituelle, alors attendez-vous à des problèmes sur la route .)