www.mikrocontroller.net

Forum: GCC Linkerproblem - C Code in C++ Code linken


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Chris R. (chrisliebaer)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo zusammen,

ich habe folgendes Problem:
Ich habe noch nicht viel mit dem GCC auf der AVR Plattform gearbeitet 
und bin mir daher nicht sicher ob das Problem an mir liegt, oder ob ich 
da villeicht gerade in einer noch nicht implementierten Sparte vom GCC 
rumstochere.

Es gibt eine main.cpp mit folgendem Inhalt
#include <io/uart.h>

int main()
{
  debugInit(9600);

}
Die Datei wird also mit g++ kompiliert. Das ist auch notwendig, also 
bitte keine Hinweise, dass ich einfach mit dem gcc kompilieren soll, ich 
brauch später C++.

Nun bau ich mir gerade eine Library für einige Funktionen, wie z.B. 
Initialisierung fürs UART; linke also diese dazu

Dort gibts es dann folgende Datei io/uart.c:
//[..]
void debugInit(unsigned pBaudRate)
{
  setDebugBaudRate(pBaudRate);
  
  //enable transmitter/receiver register
  UCSR0B |= 1 << TXEN0;
  UCSR0B |= 1 << RXEN0;
  
  //set frame format: 8data, 1 stop bits
  UCSR0C = (1 << USBS0) | (3 << UCSZ00);
  
  stdout = &mystdout;
}
//[..]

Und dazu natürlich noch die Header Datei:
#pragma once

#include <inttypes.h>
#include <stdio.h>

void debugInit(unsigned pBaudRate);
//[..]
Dies wird mit dem GCC kompiliert, also kein C++ an dieser Stelle.

Das problem ist nun, dass der Linker bei obigen Code motz, dass er 
debugInit(unsigned pBaudRate); nicht linken konnte.

Kompiliere ich die main.cpp als C Code geht es.

Hat da jemand eine erklärung für? Ich finde einfach meinen Fehler nicht 
und bin auch nicht sicher ob es nicht villeicht sogar ein Problem mit 
dem Linker an der stelle gibt, wenn C mit C++ geklinkt wird. Wobei das 
ja eigentlich egal sein müsste, da der Code zu diesem Zeitpunkt ja 
bereits kompiliert ist.

Vielen Dank schonmal

Gruß
Chris

Autor: Klaus Wachtler (mfgkw)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
#include <inttypes.h>
#include <stdio.h>

#ifdef  __cplusplus
extern "C" {
#endif

void debugInit(unsigned pBaudRate);
//[..]

#ifdef  __cplusplus
}
#endif

In der io/uart.c muß natürlich auch die .h #includet werden.

Autor: Hmmmm (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Chris R. schrieb:
> Das problem ist nun, dass der Linker bei obigen Code motz, ...

Das ist keine Fehlermeldung. Die selbige wäre aber interessant.

Autor: Chris R. (chrisliebaer)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Erstmal vielen Dank für die Idee mit dem eingebetteten C Code, auf die 
Idee bin ich garnicht gekommen, aber das ist ja auch keine Erklärung für 
das Problem, sondern nur ein Workaround.

Fehlermeldung vom Kompiler:
./main.o: In function `main':
main.cpp:(.text+0x4): undefined reference to `debugInit(unsigned int)'

Autor: Hmmmm (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Klaus Wachtler schrieb:
> #ifdef  __cplusplus
> extern "C" {
> #endif

Ist das nicht die Lösung, wenn man 'C' Code aus 'C++' heraus aufrufen 
will?
Der TO möchte genau das andere, aus 'C++ ' eine 'C' Funktion aufrufen.
Aber vielleicht hilft es in beiden Fällen, weiß ich gerade nicht.

Autor: Klaus Wachtler (mfgkw)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
PS: include-guards statt #pragma... wäre portabler:
#ifdef _IO_UART_H_
#define _IO_UART_H_

#include <inttypes.h>
#include <stdio.h>

#ifdef  __cplusplus
extern "C" {
#endif

void debugInit(unsigned pBaudRate);
//[..]

#ifdef  __cplusplus
}
#endif

#endif /* ifndef _IO_UART_H_ */

Autor: Klaus Wachtler (mfgkw)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hmmmm schrieb:
> Klaus Wachtler schrieb:
>> #ifdef  __cplusplus
>> extern "C" {
>> #endif
>
> Ist das nicht die Lösung, wenn man 'C' Code aus 'C++' heraus aufrufen
> will?
> Der TO möchte genau das andere, aus 'C++ ' eine 'C' Funktion aufrufen.
> Aber vielleicht hilft es in beiden Fällen, weiß ich gerade nicht.

Ich nehme an, daß seine (mir unbekannten Fehler) davon kommen, daß bei 
C++ per default name mangling stattfindet.
Dann wird in seiner CPP-Datei also aus dem Funktionsnamen n der .h etwas 
anderes gemacht, als wenn er die andere Datei mit C kompiliert.

dagegen hilft, die C-Funktionen als extern "C" zu deklarieren.
Nötig ist es also hier in jedem Fall; ob es alle seine Probleme löst muß 
man abwarten.

Autor: Klaus Wachtler (mfgkw)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Chris R. schrieb:
> aber das ist ja auch keine Erklärung für
> das Problem, sondern nur ein Workaround.

Dieser Workaround ist gängige Praxis.

Autor: Rolf Magnus (rmagnus)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Klaus Wachtler schrieb:
> Chris R. schrieb:
>> aber das ist ja auch keine Erklärung für das Problem, sondern nur ein
>> Workaround.
>
> Dieser Workaround ist gängige Praxis.

Außerdem ist dieser Workaround kein Workaround, sondern der dafür 
vorgesehene Weg.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net