René Nyffenegger's collection of things on the web
René Nyffenegger on Oracle - Most wanted - Feedback -
 

Der Kompiler und Linker unter Windows

Der Kompiler von Microsoft unter Visual Studio 6 und Visual Studio.NET heisst cl.exe, der Linker link.exe. Die IDE ruft beim Erstellen einer EXE diese beiden Programme automatisch auf; sie können natürlich auch manuell gestartet werden.

vcvars32.bat

Visual Studio wird mit einer Batchdatei ausgeliefert, die die Umgebung in einer DOS Box (cmd.exe) so setzt, dass cl.exe und link.exe manuell ausgeführt werden können. Diese Batchdatei befindet sich unter ..\vc98\bin, respektive ..\vc7\bin\.

cl.exe

cl wird wie folgt aufgerufen:
cl [ Option(en) ] Dateiname [ /link Linkoption(en) ]
Der Microsoft Kompiler versucht standardmässig alle drei zur Erstellung eines Exes nötigen Schritte (Präprozessor, Kompilation, Linken) auszuführen

Optionen

Aufruf ohne Optionen: Im folgenden soll gezeigt werden, wie der Kompiler in einer DOS Box aufgerufen wird, um zwei cpp Dateien und eine h Datei zu kompilieren:
main.cpp
#include "print_it.h"

int main(int argc, char* argv[]) {
  for (int i=1; i<argc; i++) {
    print_it(argv[i]);
  }
  return 0;
}
print_it.cpp
#include "print_it.h"

void print_it(const string& s) {
  cout << s << endl;
}
print_it.h
#include <iostream>
#include <string>
using namespace std;

void print_it(const string& s);

#endif
In der DOS Box kann nun der Compiler aufgerufen werden:
C:\x\y\y> cl main.cpp print_it.cpp
warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify -GX
Als erstes macht uns der Kompiler auf einen Fehler (warning) aufmerksam. <iostream> verwendet C++ Exceptions, aber um diese in einem Programm verwenden zu können, müssen diese beim Kompilieren explicit angegeben werden.
Also schalten wir die /GX Option ein:
C:\x\y\y> cl /GX main.cpp print_it.cpp
Nun erstellt der Kompiler tatsächlich eine Exe, so wie gewünscht. Tatsächlich erstellt der Kompiler auch für jede cpp Datei auch eine Objekt Datei: main.obj und print_it.obj.
Die /c Option unterdrückt das Linken. cl produziert so nur eine obj Datei.
C:\x\y\y> cl /GX /c main.cpp print_it.cpp
Mittels den /P, /EP und /E Optionen können auch die Kompilation unterdrückt werden, so dass nur der Präprozessor aktiviert wird.
/P schreibt das Ergebnis des Präprozessors in eine *.i Datei, /E schreibt das Ergebnis nach STDOUT, /EP schreibt das Ergebnis ebenfalls nach STDOUT, entfernt aber alle #line Direktiven.

link.exe

Hat man eine oder mehrere obj Dateien, können diese zu einer exe gelinkt werden.
C:\x\y\y> link main.obj print_it.obj

3.1 error LNK2001: unresolved external symbol

Ruft eine Funktion, die sich innerhalb einer obj Datei befindet, eine Funktion auf, die sich in einer anderen obj Datei befindet, auf, sucht der Linker in jeder obj Datei, ob er sie findet. Falls er sie nicht findet, gibt er einen LNK2001 raus.
C:\x\y\y> link main.obj main.obj : error LNK2001: unresolved external symbol "void __cdecl print_it(....
In main.obj (welches aus main.cpp stammt) wird versucht, print_it aufzurufen. Allerdings findet der Linker keine obj Datei, wo dieses print_it drin wäre.

Setzen der Compiler und Linker Optionen in Visual Studio

In Visual Studio können die Compiler Optionen mit Projekt->Settings (Alt+F7), C++ Tab gesetzt werden