Linken nach dem Includen
-
Hallo zusammen,
Ich arbeite mit Visual C++ 6.0.
ich habe ein ganz elementares Problem.
Zum ersten mal will ich include-dateien verwenden, die
ich aus dem Internet gehohlt habe. Konkret geht es um die GLUT Dateien.
Auch eine Installationsanleitung habe ich gefunden und befolgt.Im wesentlichen habe includedateien in den entsprechenden Ordner kopiert,
Lib.Dateien in den entsprechenden Ordner kopiert und eine DLL datei im
besriebenen Verzeichnis gespeichert.ALs ich dann ein erstes Programm schreiben wollte, konnte ich das Programm
Kompilieren, aber nicht linken. Sämtliche Versuche den Linker einzustellen haben dazu geführt, dass andere Programme jetzt auch nicht mehr gelinkt den können.Kann mir jemand erklären, was ich da falsch gemacht habe?
Nebenbei ist mir spetziell bei den lib dateien aufgefallen, dassdiese noch komprimiert sind. Muss ich diese irendwie dekomprimieren?
-
Hmmm vielleicht machst Du angaben zu den Fehlern die der Linker ausspuckt.
Aber wenn deine libs noch als rar oder zip komprimiert sind würde es sich anbieten mal zu versuchen sie zu entpacken.
Warum jetzt garnichts mehr läuft??? Vielleicht hast Du die Linker suchpfade verändert. Das ist der -L parameter beim gcc.
gruß,
muli
-
folgende meldung spukt der linker aus.
--------------------Konfiguration: gluttest - Win32 Debug--------------------
Linker-Vorgang läuft...
LIBCD.lib(wincrt0.obj) : error LNK2001: Nichtaufgeloestes externes Symbol _WinMain@16
Debug/gluttest.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.gluttest.exe - 2 Fehler, 0 Warnung(en)
Bemerkung: Sämtliche Linkereinstungen haben wieder standarteinstellungen.
Muss man den Linker irgendwie einstellen?Dabei habe ich folgends testprogramm aus dem Internet verwendet.
Die Kompilierung verläuft einfandfei.#include <GL/glut.h> //GLUT .h-Datei, lädt auch GL .h-Dateien
void display() //Zeichenfunktion
{
glBegin( GL_POLYGON );
glVertex3f( -0.5, -0.5, -0.5 );
glVertex3f( 0.5, -0.5, -0.5 );
glVertex3f( 0.5, 0.5, -0.5 );
glVertex3f( -0.5, 0.5, -0.5 );
glEnd();
glFlush(); //Buffer leeren
}
int main(int argc, char **argv)
{
glutInit(&argc, argv); // GLUT initialisieren
glutInitDisplayMode( GLUT_RGB ); // Fenster-Konfiguration
glutInitWindowSize ( 600,600 );
glutCreateWindow("1. OpenGL Programm"); // Fenster-Erzeugung
glutDisplayFunc(display); // Zeichenfunktion bekannt machen
glutMainLoop();
return 0;
}
-
deine int main() ist der Einsprungspunkt für Konsolenanwendungen.
Du scheinst aber eine Win32-Anwendung zu haben.
Dort sieht das etwa so aus:WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
Sowas kann man beim Erstellen seines Projekts auch schon generieren lassen.
Dann kannst du dir mal anschauen, was da alles dazu gehört.
-
tatsächlich, fürs erste funktiorts.
Vielen Dank
-
Funktioniert leider noch immer nicht ganz. Diesmal wollte ich mit SDL arbeiten.
Wieder habe ich keine Problem mit dem Compilieren,aber folgende Fehlermeldung spuckt der Linker jetzt aus:
--------------------Konfiguration: gluttest - Win32 Debug--------------------
Linker-Vorgang läuft...
glutest.obj : error LNK2001: Nichtaufgeloestes externes Symbol _SDL_Quit
glutest.obj : error LNK2001: Nichtaufgeloestes externes Symbol _SDL_GetError
glutest.obj : error LNK2001: Nichtaufgeloestes externes Symbol _SDL_Init
LIBCD.lib(wincrt0.obj) : error LNK2001: Nichtaufgeloestes externes Symbol _WinMain@16
Debug/gluttest.exe : fatal error LNK1120: 4 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.gluttest.exe - 5 Fehler, 0 Warnung(en)
Dabei habe ich folgends Programm aus dem Internet verwendet:
#include <SDL/SDL.h> // SDL-Header
#include <SDL/SDL_opengl.h> // Bindet plattformabhängig die richtigen Header ein
#include <iostream> // für Konsolenausgabenusing std::cout; // Wir verwenden std::cout und
using std::endl; // std::endl für die Konsolenausgaben// Die main Funktion muss unter Windows unbedingt
// diese Form haben, da es ansonsten zu einem
// Linkerfehler kommen würde.
int main(int argc, char **argv)
{
if( SDL_Init( SDL_INIT_VIDEO ) != 0 ) // Initialisieren des SDL Video Subsystems
{
cout << "Die SDL konnte nicht initalisiert werden (" << SDL_GetError() << ")" << endl;
return 1;
}cout << "Willkommen zum SDL Testprogramm." << endl;
SDL_Quit(); // Herunterfahren der SDL Bibliotheken
return 0;
}
-
Du musst darauf achten, dass du deinen kompilierten Quelltext auch gegen die entsprechenden Bibliotheken linkst.
Je nachdem welchen Projekttyp du verwendest fügt die IDE automatisch ein paar Bibliotheken hinzu, gegen die gelinkt wird. Verwendest du Funktionen die sich in anderen Bibliotheken befinden, reicht es nicht nur die Header einzubinden, du müsstest auch gegen die entsprechenden lib Dateien linken, d.h. die Namen der libs unter Projekt/Einsellungen/Linker hinzufügen.
Wenn dein Quelltext mit dem Einstiegspunkt main() arbeitet ist es günstiger eine Win32-Konsolenanwedung zu erstellen, denn dann sorgt die IDE dafür, dass gegen die nötige Bibliothek gelinkt wird. Du hast vermutlich eine Win32-Anwendung erstellt die als Einstiegspunkt WinMain() voraussetzt.
Also:
- arbeite mit dem richtigen Projekttyp
- füge die nötigen libs unter Projekt/Einstellungen/Linker hinzuFalls die SDL - Anleitung/Referenz dir nicht sagt welche Bibliotheken bei der Verwendung einer bestimmten Funktion gelinkt werden müssen, nimmst du halt alle.
-
Hallo hmpf,
vielen dank für deine Antwort.NUn habe ich uner Projekt/einstellungen/Linker/Projekt-optionen
noch SDLmain.lib und SDL.lib geschrieben. ies sind die beiden Dateien, die ich zuvor in den Ordner LIB kopiert habe.Die Fehlermeldung sieht jetzt so aus:
--------------------Konfiguration: sdltest - Win32 Debug--------------------
Linker-Vorgang läuft...
msvcrt.lib(MSVCRT.dll) : error LNK2005: _exit bereits in LIBCD.lib(crt0dat.obj) definiert
msvcrt.lib(MSVCRT.dll) : error LNK2005: _fclose bereits in LIBCD.lib(fclose.obj) definiert
msvcrt.lib(MSVCRT.dll) : error LNK2005: __isctype bereits in LIBCD.lib(isctype.obj) definiert
LIBCD.lib(crt0init.obj) : warning LNK4098: Standardbibliothek "msvcrt.lib" steht in Konflikt mit anderen Bibliotheken; /NODEFAULT:Bibliothek verwenden
Debug/sdltest.exe : fatal error LNK1169: Ein oder mehrere mehrfach definierte Symbole gefunden
Fehler beim Ausführen von link.exe.sdltest.exe - 4 Fehler, 1 Warnung(en)
-
so, nach intensivem suchen im INternett habe ich in eineanderen Forum gefunden, dass schon einmal jemand dasselbe Problem hatte.
ICh kenne jetzt die Lösung. Das hat jtzt so viel nerven gekostet, dass ich es auch verstehen möchte. KAnn mir das bitte jemnad erklären.Ich schreibe zu beginn des quellcodes:
#ifdef _WIN32
#undef main
#endifjetzt klapps.
Was geschieht da?
-
Mal eine Frage zwischendurch: Hast du in deinem Projekt, wie von den SDL-Jungs verlangt unter Projekt->Einstellungen->C/C++ bei Kategorie "Code Generation" unter "Laufzeit-Bibliothek" die Einstellung "Multithreaded DLL" vorgenommen?
Wenn ich nämlich deinen Linkfehler bezüglich der LIBCD.lib sehe, dann sieht es so aus, als hättest du das nicht getan.
Also, bevor du irgendwelche Makros umdefinierst, versuch doch zuerst das.