Autor Thema: GCC Funktionen in Header "undefined reference"  (Gelesen 25009 mal)

LittleFox

  • Beiträge: 306
    • Profil anzeigen
    • LF-Net.org
Gespeichert
« Antwort #20 am: 02. April 2012, 17:14 »
-lgcc an den Compileraufruf anhängen

OS_3000

  • Beiträge: 53
    • Profil anzeigen
Gespeichert
« Antwort #21 am: 02. April 2012, 17:16 »
Leider kommt dann "i586-elf-gcc: cannot find -lgcc".

LittleFox

  • Beiträge: 306
    • Profil anzeigen
    • LF-Net.org
Gespeichert
« Antwort #22 am: 02. April 2012, 17:18 »
äh - sorry
Linkeraufruf - hoff ich :D

Edit: Kommt davon wenn man auf Arbeit irgendwas postet :D

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #23 am: 02. April 2012, 17:21 »
gcc -m 32 -print-libgcc-file-name sagt dir, wo sie liegt (falls sie installiert ist - ansonsten kann es sein, dass er dir die 64-Bit-Variante unterschieben will, die natürlich nicht funktioniert!). Diese .a-Datei übergibst du einfach mit an ld.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

OS_3000

  • Beiträge: 53
    • Profil anzeigen
Gespeichert
« Antwort #24 am: 02. April 2012, 17:32 »
Ihr seit echt super, jetzt gehts!  :-D
Bläht aber ein bisschen den Kernel auf. (8kb -> 40kb)

Gibt es eine Möglichkeit nicht immer den Pfad "C:\Programm Ordner\MinGW\OSprogramming\lib\gcc\i586-elf\4.4.0\libgcc.a" angeben zu müssen? Der ist nämlich höllisch lang und wenn ich das auf einen anderen Computer kompilieren will, muss er auch angepasst werden.

Sowas wie von LittleFox wäre gut.
Und ja, dass hab ich natürlich beim Linker angegeben.  :wink:

Case23

  • Beiträge: 5
    • Profil anzeigen
Gespeichert
« Antwort #25 am: 02. April 2012, 20:52 »
die Regeln bezüglich "inline" soweit ich es gerade im kopf habe:
1) niemals inline alleine verwenden, da die Sichtbarkeit (im Objectfile) von Funktionen dann abhängt vom Compiler und vom Optimierungslevel.
2) static inline sagt dem Compiler (genauso wie static alleine) das diese Funktion nicht sichtbar sein soll ausserhalb des generierten Objectfiles. Damit wird diese Funktion entweder geinlined, oder als eigene Funktion generiert, die aber nicht sichtbar ist nach aussen. Nachteil ist das wenn der Compiler in mehreren Objectfiles sich entscheidet die Funktion nicht zu inlinen, die Funktion mehrfach erzeugt wird (pro objectfile bis zu einmal) und dann auch mehrfach im executable ist.
3) extern static sagt dem Compiler dass er die Funktion entweder inlinen soll, oder sie als extern betrachten soll. Wenn man es so organisiert dass in allen C-Dateien als extern inline verwendet wird und in einer einzige als normale Funktion, wird genau in einem Objectfile die Funktion sichtbar sein (immer), und in allen anderen entweder geinlined oder als externe reference.
Beispiel zu 3:
inlineit.h:#ifdef INLINEIT_C
#define INLINEIT_INLINE
#else
#define INLINEIT_INLINE extern inline
#endif

INLINEIT_INLINE foobar() {
...
}
inlineit.c:#define INLINEIT_C
#include "inlineit.h"
anotherfile.c:#include "inlineit.h"

/*use foobar here*/

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #26 am: 02. April 2012, 21:14 »
Gibt es eine Möglichkeit nicht immer den Pfad "C:\Programm Ordner\MinGW\OSprogramming\lib\gcc\i586-elf\4.4.0\libgcc.a" angeben zu müssen? Der ist nämlich höllisch lang und wenn ich das auf einen anderen Computer kompilieren will, muss er auch angepasst werden.
Ein Skript, das gcc -m32 -print-libgcc-file-name ausführt, zum Beispiel?
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

OS_3000

  • Beiträge: 53
    • Profil anzeigen
Gespeichert
« Antwort #27 am: 02. April 2012, 22:07 »
Ich wüsste nicht, wie ich das in einem Script machen soll.
Wahrscheinlich bist du Linuxumgebungen gewöhnt, da geht sowas wahrscheinlich.   :roll:

Zu Case23:
Dieses Problem hat sich eigentlich bereits geklärt.  :wink:
Was ich noch nicht so ganz verstanden hab ist, warum "extern static" immer geinlined wird.

chris12

  • Beiträge: 134
    • Profil anzeigen
Gespeichert
« Antwort #28 am: 02. April 2012, 22:36 »
Wenn du unter Windows bist ... was ich einfach mal dem Pfad aufbau entnehme ... dann kannst du einfach Batch nehmen, das ist auch eine scriptsprache ... ;)
OS? Pah! Zuerst die CPU, dann die Plattform und _dann_ das OS!

OS_3000

  • Beiträge: 53
    • Profil anzeigen
Gespeichert
« Antwort #29 am: 02. April 2012, 23:03 »
Natürlich, kann ich Batchdateien erstellen.
Doch darin kann man meines Wissens nicht die Ausgabe eine Programmes in eine MSDOS-Variable umleiten.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #30 am: 02. April 2012, 23:08 »
Hast du nicht eh MSYS installiert? Das hat doch eine bash?
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #31 am: 02. April 2012, 23:16 »
Makefile? Makefail! So setzt man unter Windows die Variable LIBGCC_FILE_NAME mit dem Dateinamen:

FOR /F "usebackq" %%I IN (`gcc -print-libgcc-file-name`) DO SET LIBGCC_FILE_NAME=%%I
Ich unterwandere hier mal wieder alle Versuche die Leute zu guten Praktiken zu bewegen.  :evil:
Dieser Text wird unter jedem Beitrag angezeigt.

OS_3000

  • Beiträge: 53
    • Profil anzeigen
Gespeichert
« Antwort #32 am: 02. April 2012, 23:35 »
MSYS? Nein

FOR /F "usebackq" %%I IN (`gcc -print-libgcc-file-name`) DO SET LIBGCC_FILE_NAME=%%IFunktioniert fast.
Bloß wenn ein Leerzeichen im Pfad ist(wie bei mir :cry:) dann bricht es ab.
Es liefert bei mir ledeglich "C:\Programm" zurück.


Wusste gar nicht, dass man sowas in MSDOS machen kann.  :wink:

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #33 am: 02. April 2012, 23:36 »
Zu meinen Zeiten, als die Gummistiefel noch aus Holz waren, hatte for noch keine so komischen Parameter.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

OS_3000

  • Beiträge: 53
    • Profil anzeigen
Gespeichert
« Antwort #34 am: 02. April 2012, 23:55 »
Nach ein bisschen rumprobieren, hab ich es jetzt hingekriegt.  :-D

FOR /F "usebackq tokens=*" %%I IN (`i586-elf-gcc -print-libgcc-file-name`) DO SET LIBGCC_FILE_NAME=%%I
Hätte nie gedacht, dass das mit der MSDOS-Stapelverarbeitung geht.
Nochmal vielen Dank für den genialen Tipp.  :-D

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #35 am: 03. April 2012, 00:16 »
Viel Spaß damit. ;) Übrigens ist das nicht für DOS sondern Windows NT.
Dieser Text wird unter jedem Beitrag angezeigt.

OS_3000

  • Beiträge: 53
    • Profil anzeigen
Gespeichert
« Antwort #36 am: 03. April 2012, 00:23 »
Die Stapelverarbeitung läuft aber in einem MSDOS-Subsystem. :wink:

Case23

  • Beiträge: 5
    • Profil anzeigen
Gespeichert
« Antwort #37 am: 03. April 2012, 11:57 »
@OS_3000
static inline muss nicht inlinen, aber durch das static wird es auf jedenfall nicht sichtbar nach aussen

OS_3000

  • Beiträge: 53
    • Profil anzeigen
Gespeichert
« Antwort #38 am: 04. April 2012, 00:38 »
Upps...
Das ist dann wohl weniger für Standardlibs und Betriebssystemcalls geeignet.  :oops:
Also dann verwende ich "extern static".

EDIT: Ne auch nicht:
Bei "extern static" motzt der Compiler.
EDIT2: "extern inline" geht auch nicht.
Da motzt der Linker.
« Letzte Änderung: 04. April 2012, 00:42 von OS_3000 »

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #39 am: 04. April 2012, 02:17 »
Die Stapelverarbeitung läuft aber in einem MSDOS-Subsystem. :wink:
Nein, da Kommandozeile != DOS.
Du meinst COMMAND.COM, aber der kennt so fancy parameters nicht. Dafür brauchst du cmd.exe, eine echte WinNT-Anwendung.

PS: Beschaff dir eine UNIX-Umgebung. Bevorzugt mit einer unixoiden Basis. Das macht vieles einfacher. ;-)

So, nachdem die Haare hinreichend gespalten sind, geh ich schlafen. :P

 

Einloggen