# Problem mit Einbindung von Kernel32 unter Microsoft Visual C++ Toolkit 2003



## Lukasz (15. Januar 2005)

Hallo zusammen;

Ich bin ein leider erst ein Anfänger. Mein erstes Problem liegt nicht am Code selbst, sondern bei der Einbindung von „Kernel32.lib“! Microsoft beschreibt das ganze folgend:

There are no redistributable files (i.e., dll's/cab's, etc.) included with the Visual C++ Toolkit 2003. Object library files included with the Visual C++ Toolkit 2003 (e.g. the C Runtime Library static libraries designated with the suffix ".lib") will be automatically linked to your program when they are compiled by the Visual C++ compiler and linker.  Inclusion of these static libraries as compiled into your program is acceptable; you may not, however, redistribute the static libraries standalone - on their own.

Aber leider komme ich nicht zurecht, wie ich diese Bibiliothek einbinden kann. Dabei versuche ich folgenden Code zu kompilieren:

lgc.cpp
comiliert mittels 
cl lgc.cpp

#include <.?.>


int main(){
CopyFile("1.txt","2.txt",TRUE);
return 0;
}

Das Ergebnis ist wie man sich das ganze vorstellen kann so, dass mir der Compiler erklärt, dass er dir Funktion CopyFile(char *, char *, ..) nicht versteht! Ich leider verstehe auch nicht wie ich das mit den Parametern der sonst wie hinbekommen kann, das die Kernel32.lib eingebunden wird.

Mein Compiler wird mit folgenden Parameter gestartet:






Beim einbinden einer bestimmten *.H Datei gibt es keine Probleme. Möchte ich also Beispielweise die iostream Einbinden so geht dies auch mittels:
#include <iostream>

Noch mal zum eigentlichen:
Ich möchte ein kleines Programm schreiben, welches mir 3 Dateien von a nach B kopiert. Damit ich diese Windows spezifischen Befehle bzw. Funktionen nutzen kann, brauche ich die Kernel32.lib, die sich nicht in das Programm intigrieren   lässt, oder ich habe wirklich kein Plan wie ich das fertig bringen soll.

Die Kernel32.lib liegt im Verzeichnis lib/ direkt über dem Compiler.

Falls einer von euch schon mal mit Visual Studio gearbeitet hat, der kann mir eventuell rat geben. Ich selbst habe Visual Studio nicht, aber den zugehörigen Compiler, den Microsoft kostenlos zum downloaden anbietet.

Liebe Grüsse und Danke für eure Hilfe!

Nachtrag:
Microsoft beschreibt das ganze mit folgenden Parameter
Linking

Option Purpose 
/F Sets stack size 
/LD Creates a dynamic-link library 
/LDd Creates a debug dynamic-link library 
/link Passes the specified option to LINK 
/MD Compiles to create a multithreaded DLL, using MSVCRT.lib 
/MDd Compiles to create a debug multithreaded DLL, using MSVCRTD.lib 
/ML Compiles to create a single-threaded executable file, using LIBC.lib 
/MLd Compiles to create a debug single-threaded executable file, using LIBCD.lib 
/MT Compiles to create a multithreaded executable file, using LIBCMT.lib 
/MTd Compiles to create a debug multithreaded executable file, using LIBCMTD.lib 

aber von Kernel32 ist nicht die Rede, obwohl diese in der Lib liegt!


----------



## Daniel Toplak (16. Januar 2005)

Zitat aus der MSDN


> Header: Declared in Winbase.h; include Windows.h.
> Library: Use Kernel32.lib.


Ergo musst du <Windows.h> includieren und wie du schon richtig sagtest die Kernel32.lib dazu linken.
Also ich kenn mich zwar im Visual Studio aus, aber ich weiß nicht wie man bei dem MS-Compiler/Linker das ganze als Kommandozeile schreiben muss.
wie du gesagt hast muss man mit "/link" parameter an den Linker übergeben.
Was erhältst du nach "cl lgc.cpp" ?
Bestimmt ein "Objectfile" und das musst du zusammen linken mit der Kernel32.lib zu einer .exe.
Evtl mal bischen in der Doku schauen.

P.S. wenn du den gcc verwenden würdest, dann könnt ich dir weiterhelfen.

Daniel


----------



## Billie (16. Januar 2005)

Also ich arbeite wie du mit dem Visual Toolkit und natürlich musst du dir auch das Platform SDK runterladen, wenn du Windows Programme schreiben willst (mit Fenster usw.). Dann setzt du die jeweiligen Umgebungsvariablen, sieht bei mir so aus:

INCLUDE=E:\Programme\Microsoft Visual C++ Toolkit 2003\include;E:\Programme\Microsoft Platform SDK for Windows XP SP2\include;%INCLUDE%

LIB=E:\Programme\Microsoft Visual C++ Toolkit 2003\lib;E:\Programme\Microsoft Platform SDK for Windows XP SP2\lib;%LIB%

PATH=E:\Programme\Microsoft Visual C++ Toolkit 2003\bin;%PATH%;C:\Windows\System32

Dann wird nur noch kompiliert und gelinkt: cl foobar.cpp /EHsc /link kernel32.lib user32.lib gdi32.lib


----------



## Lukasz (18. Januar 2005)

Erst einmal danke für eure Hilfe!

Also ich habe den gcc auch. Dort ist windows.h im Verzeichniss WIN32, komme damit aber auch nicht zu recht. Und in Visual Studio habe ich keine Windows.h. Ich dachte dacher beides zu kombinieren und habe so auf die Windoes.h aus der gcc Bib. gleinkt. So bleibt das ding aber dennoch stehen, da es heist der Befehl CopyFile(char *, char *, ..) ist nicht definiert.

gebe ich 
#define ...
usw. ein, compiliert er zwar, es kommt aber zu einem Programmlauffehler. Ist auch verständlich, da die BIB Windows.h nicht zum kompilier gehört. So habe ich mich auch ein wenig an die Dokumentation gemacht. Soweit ich das verstanden habe (bin nicht der begabt in Englisch) soll durch linken der Kernel32.LIB Windows spezifische Befehele eingebunden werden.

In der online Doku steht:

Um eine Datei zu kopieren rufen Sie die Funktion CopyFile("FROM","TO" TRUE or FALSE);

Dabei steht das True wür überschreiben erlaubt, und Flase für Überschreiben nicht erlaubt.
Nu habe ich auch schon die Kernel32lib eingebunden und es will einfach nicht!

cl lgc.cpp /link Kernel32.LIB

Der Fehler wir dabei nicht behoben, trotz dass die Libary eingebunden ist.


Eventuell ist es mir eigentlich egal. Vieleicht zeigt mir einer wie ich das unter Windows realisieren kann. Ich brauche echt nur ein Programm, welches mir 3 Daten von A nach B kopiert. Mehr braucht das Programm auch nicht  tun.

Vielen Dank für eure Hilfe!


----------

