2009-05-28 14 views
1

Une idée à propos de cette erreur?Aide avec un message d'erreur de gcc

 
gcc -oxtmpmain.exe xtmpmain.o fiber_driver.o xtmp_options.o getopt.o D:\usr\xtensa\XtDevToolsDE\in 
stall\tools\RB-2008.4-win32\XtensaTools\lib\iss\xtmp.lib 
xtmpmain.o(.text+0x213):xtmpmain.c: undefined reference to `_uart_setup' 
xtmpmain.o(.text+0x2da):xtmpmain.c: undefined reference to `_uart_cleanup' 
collect2: ld returned 1 exit status 
make: *** [xtmpmain.exe] Error 1 

Répondre

1

Cela signifie que les fonctions appelées xtmpmain.c appelées uart_setup() et uart_cleanup(), mais ils n'ont pas été trouvés par l'éditeur de liens. Vous devez probablement inclure une bibliothèque ou implémenter ces fonctions pour Windows en termes d'API Win32.

Certains "est branché sur les questions" sont:

  • sont les fonctions déclarées?
  • Les fonctions sont-elles définies (c'est-à-dire implémentées)?
  • Avec exactement ces noms?
  • Ces définitions ont-elles été exclues par le préprocesseur?
  • Il existe une option gcc qui contrôle la présence ou l'absence d'un trait de soulignement. Vous n'avez pas accidentellement utilisé cela pour un fichier et pas d'autres, n'est-ce pas?
  • Vérifiez la convention d'appel déclarée. __cdecl et __stdcall sont des animaux très différents. Ils produisent généralement des noms de symboles exportés incompatibles pour des raisons de sécurité, et cette erreur peut en être un symptôme.

S'il s'agit d'un projet de portage, il est probable que l'implémentation d'origine d'une fonction UART est écrite de manière dépendante de la plate-forme. Dans ce cas, ils seraient souvent protégés par un #ifdef d'une certaine forme qui dépend de la plate-forme de compilation. Pour résoudre ce problème, vous devez les implémenter pour cette plate-forme, dans un style compatible avec leur utilisation dans le reste de l'application, et de manière similaire.

+0

comment? Ces deux fns sont définis par moi dans xtmpmain.c son semblable à ordinaire fns r8? –

+0

Ils n'ont pas été définis avec ces noms exacts (sans le trait de soulignement principal qui est commun C name mangling) dans n'importe quel fichier nommé sur votre ligne de liaison, ou l'éditeur de liens les aurait trouvés. Vérifiez attentivement l'orthographe et assurez-vous qu'ils n'ont pas été ignorés par #ifdef ou similaire. – RBerteig

4

Il s'agit d'une erreur de liaison simple. Vous appelez deux fonctions, uart_setup() et uart_cleanup(), que l'éditeur de liens ne trouve pas.

Il pourrait y avoir plusieurs causes, y compris (mais certainement sans s'y limiter):

  • Ils sont vraiment manque, peut-être vous avez oublié de lier à un fichier objet
  • Les espaces de noms empêchant la fonction existante d'être trouvé
  • chemins Bibliothèque
  • ou Canaliser problèmes avec les noms externes et underscores

Sans plus de détails, c'est difficile à dire à coup sûr.