105 votes

Erreur C : référence non définie à une fonction, alors qu'elle est définie

Il s'agit d'un simple programme, mais je n'arrête pas d'obtenir cette erreur de compilation. J'utilise MinGW comme compilateur.

Voici le fichier d'en-tête, point.h :

//type for a Cartesian point
typedef struct {
  double x;
  double y;
} Point;

Point create(double x, double y);
Point midpoint(Point p, Point q);

Et voici point.c :

//This is the implementation of the point type
#include "point.h"

int main() {
  return 0;
}
Point create(double x, double y) {
  Point p;
  p.x = x;
  p.y = y;
  return p;
}

Point midpoint(Point p, Point q) {
  Point mid;
  mid.x = (p.x + q.x) / 2;
  mid.y = (p.y + q.y) / 2;
  return mid;
}

Et c'est là qu'intervient le problème du compilateur. Je continue à obtenir :

testpoint.c : référence non définie à 'create(double x, double y)'

Bien qu'il soit défini dans le point.c.

Il s'agit d'un fichier séparé appelé testpoint.c :

#include "point.h"
#include <assert.h>
#include <stdio.h>
int main() {
  double x = 1;
  double y = 1;
  Point p = create(x, y);

  assert(p.x == 1);
  return 0;
}

Je ne sais pas quel est le problème.

31voto

cp.engr Points 346

J'ai eu ce problème récemment. Dans mon cas, mon IDE était configuré pour choisir le compilateur (C ou C++) à utiliser pour chaque fichier en fonction de son extension, et j'essayais d'appeler une fonction C (c'est-à-dire à partir d'un fichier .c ) à partir du code C++.

En .h pour la fonction C n'était pas entouré de cette sorte de garde :

#ifdef __cplusplus
extern "C" {
#endif

// all of your legacy C code here

#ifdef __cplusplus
}
#endif

J'aurais pu l'ajouter, mais je n'ai pas voulu le modifier, alors je l'ai juste inclus dans mon fichier C++ comme cela :

extern "C" {
#include "legacy_C_header.h"
}

(Un coup de chapeau à l'équipe de UncaAlby pour son explication claire de la effet du "C" externe .)

10voto

Cam Points 6835

Je pense que le problème est que lorsque vous essayez de compiler testpoint.c, il inclut point.h mais ne connaît pas point.c. Puisque point.c contient la définition de create L'absence de point.c entraînera l'échec de la compilation.

Je ne suis pas familier avec MinGW, mais vous devez dire au compilateur de chercher point.c. Par exemple, avec gcc, vous pourriez faire ceci :

gcc point.c testpoint.c

En autres vous devez également supprimer l'un de vos main puisqu'il ne peut y en avoir qu'une seule.

4voto

Richard Schneider Points 16054

Ajouter le mot-clé "extern" aux définitions des fonctions dans point.h

0voto

Tommaso Micini Points 1

J'ai vu ici que cette question En langage de programmation C, j'obtiens toujours l'erreur suivante

a été répondu ici, de sorte que le fil de discussion semble fermé pour les réponses. Je ne suis pas d'accord. Il s'agit d'un code différent.

La réponse devrait être que nous ne savons pas ce qui se trouve dans le fichier d'en-tête personnalisé "functions.h". De même, nous ne savons pas ce que sont les

MAPA m;
POSICAO heroi;

S'agit-il de fonctions, de constantes ? S'il s'agissait de constantes, on s'attendrait à ce qu'elles soient précédées de #define et qu'il n'y ait pas de point-virgule, par exemple.

#define MAPA m 
#define POSICAO heroi

Si vous aviez l'intention de prototyper la fonction, puisqu'il y a un point-virgule, vous n'avez pas inséré les parenthèses (). Dans ce cas, MAPA et POSICAO sont des fonctions de type personnalisé, dont le contenu doit être déterminé dans "Functions.h"

Il est également possible que vous ayez voulu importer les fonctions, les variables ou les constantes d'un autre répertoire, et dans ce cas, il vous manque le mot

extern MAPA m;

-1voto

Neuwelt Points 1

J'ai eu un problème similaire en exécutant un tas de fichiers .c dans un répertoire, tous liés à un fichier d'en-tête avec des prototypes de fonctions personnalisées. J'ai exécuté :

$gcc -Wall -Werror -Wextra -pedantic -std=gnu89 *.c

J'obtiens ces erreurs :

/usr/bin/ld: /tmp/ccovH4zH.o: in function `_puts': 3-puts.c:(.text+0x2f): undefined reference to `_putchar'
/usr/bin/ld: 3-puts.c:(.text+0x51): undefined reference to `_putchar'
/usr/bin/ld: /tmp/ccGeWRqI.o: in function `main': _putchar.c:(.text+0xe): undefined reference to `_putchar'
/usr/bin/ld: _putchar.c:(.text+0x18): undefined reference to `_putchar'
/usr/bin/ld: _putchar.c:(.text+0x22): undefined reference to `_putchar'
/usr/bin/ld: /tmp/ccGeWRqI.o:_putchar.c:(.text+0x2c): more undefined references to `_putchar' follow
collect2: error: ld returned 1 exit status

Note : Tous les fichiers ont été liés au même fichier d'en-tête avec toutes les déclarations de fonctions.

J'ai réussi à compiler avec succès après avoir ajouté l'option -c au compilateur gcc comme :

$gcc -Wall -Werror -Wextra -pedantic -std=gnu89 -c *.c

Cette opération s'est déroulée avec succès.

Juste au cas où quelqu'un rencontrerait le même problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X