Autor Thema: Undefined reference to XXX  (Gelesen 3753 mal)

fNek

  • Beiträge: 7
    • Profil anzeigen
Gespeichert
« am: 27. November 2012, 20:03 »
Ich erhalte bei meinem C++-Kernel vom Linker Fehlermeldungen, weil die Hauptfunktion und die Konstruktorenfunktion (wie im C++-Tutorial) nicht gefunden werden. Es ist nicht dieser Fehler mit dem extern "C" (das habe ich schon mindestens 100 mal überprüft). Es ist auch kein Tippfehler. Was kann es sonst sein?

Sources auf Anfrage

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 27. November 2012, 20:12 »
Wie lautet die genaue Fehlermeldung?
Dieser Text wird unter jedem Beitrag angezeigt.

fNek

  • Beiträge: 7
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 28. November 2012, 17:06 »
Fehlermeldung:

Zitat von: make
ld -Tkernel.ld -o bin/kernel obj/start.o obj/main.o
obj/start.o: In function `_start':
(.text+0x9): undefined reference to `init_ctors'
obj/start.o: In function `_start':
(.text+0xf): undefined reference to `kmain'
make: *** [bin/kernel] Fehler 1

Kein Tippfehler, nicht extern "C" vergessen...
Ich weiß nicht, woran es liegen könnte

paule22

  • Beiträge: 16
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 28. November 2012, 17:13 »
an der main.o,
die wird mit libc funktionen aufbereiten.
ctor = C++ constructor's
wenn Du C und C++ code verwendest

fNek

  • Beiträge: 7
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 28. November 2012, 17:21 »
Ich habe alles so gemacht, wie im Tutorial (C++-Kernel); init_ctors ist eine Funktion von mir, kmain ist die Kernel-MAIN Funktion.

init_ctor ist die Funktion, die im Tutorial "C++-Kernel mit GRUB" als initializeConstructors aufgelistet wird. Weil ich mir gedacht habe, dass das früher oder später Tippfehler ergibt, habe ich sie umbenannt in init_ctors. (Tippfehler gab es schon - ein Mal hbe ich z.B. als initialiseConstructors auf die Funktion verwiesen...)

Mein Startup-Code
Zitat von: start.S
/*
 * Copyright (C) 2012 Martin Formanek
 *
 * This file is part of MakeMyOS.
 *
 * MakeMyOS is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * MakeMyOS is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with MakeMyOS.  If not, see <http://www.gnu.org/licenses/>.
 */

.section multiboot
/* contains the multiboot header */

#define MBH_MAGIC 0x1BADB002
#define MBH_FLAGS 0x3
#define MBH_CHECKSUM -(MBH_MAGIC + MBH_FLAGS)

.int MBH_MAGIC
.int MBH_FLAGS
.int MBH_CHECKSUM

.section .text
/* contains some preperations */

.global _start
.extern kmain
.extern init_ctors
_start:
  cmp %eax, 0x2BADB002
  jne _stop
  call init_ctors
  push %ebx
  call kmain
 
 _stop:
  cli
  hlt
  jmp _stop

paule22

  • Beiträge: 16
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 28. November 2012, 18:18 »
init_ctors und dtors sind halt keine normale user funktionen
die werden verwendet um die "class" aufrufe zu händeln.
die daten werden gesammelt und der linker sollte dann alles zusammen linken

z.b. so:

gcc -o kernel.exe kernel.cc -lc

ich habs auch mal versucht, aber sein lassen.
schau mal im MyOS Thread, da hab ich einen link - wenn der noch geht,
der auf mein Projekt verweist.
Vielleicht hilft Dir das erstmal weiter.

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 29. November 2012, 18:18 »
lass dir mal die Symbole ausgeben die du in der main.o definiert hast:
$ nm obj/main.ovielleicht packt dein Compiler ja Underscores davor.
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

fNek

  • Beiträge: 7
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 30. November 2012, 18:55 »
Ha! Recht gehabt, MNemo!
Aus irgendeinem Grund wandelt der Compiler die Funktionsnamen um - obwohl ich sie als extern "C" vorausdeklariert habe. Zählt das für den C++-Compiler nicht? Oder hat der Präprozessor die Konstante _cplusplus nicht erkannt?

Mein Lösungsansatz ist jetzt, die Funktionen direkt bei der Definition als extern "C" zu bezeichnen. Ich poste gleich, ob es hilft.

fNek

  • Beiträge: 7
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 30. November 2012, 18:58 »
Offenbar definiert mir der Präprozessor nicht die Konstante _cplusplus, die ich in einem ifdef benutzt habe. Auf den Fehler hätte ich selber kommen können... Tut mir leid. Wie heißt die Konstante, die bei C++ immer definiert ist, wenn nicht _cplusplus?

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 30. November 2012, 19:04 »
__cplusplus mit zwei Unterstrichen.
Dieser Text wird unter jedem Beitrag angezeigt.

fNek

  • Beiträge: 7
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 02. December 2012, 09:18 »
Danke!

 

Einloggen