Ich versuche gerade, eine Sammlung von C-Modulen (per gcc-Option -x c++)
mit dem C++-Compiler zu übersetzen.
Die Syntax ist so weit zurechtgebogen, dass sich alle Dateien sowohl in
C, als auch in C++ fehlerfrei übersetzen lassen.
Die per C-Compiler erzeugten .o-Files lassen sich auch fehlerfrei
linken. Nicht so die C++-Objektfiles:
In einem der Module steht folgende Deklaration:
1 | typedef const struct {
|
2 | <liste von funktionspointerntypen>
|
3 | } UARTlinkTable, *UARThandle;
|
4 |
|
5 | UARTlinkTable BT05uart = {
|
6 | <liste von funktionspointern>
|
7 | };
|
8 |
|
9 | UARThandle activeUart = &BT05uart;
|
Der Linker findet in den C++-Objektfiles die Definition für activeUart
nicht.
Wenn ich mir mit dem Tool nm von Linux die Symboltabellen der .o-Files
ansehe, fällt auf, dass
- in der C-Version das Symbol activeUart als global getaggt ist, aber
- in der C++-Version als lokal
Folgerichtig findet der Linker beim C++-linken activeUart nicht.
Warum wird
1 | UARThandle activeUart = &BT05uart;
|
von C++ als lokal angesehen?