5

Ich verwende Visual Studio seit einiger Zeit, hauptsächlich für C++. Ich war oft in der Notwendigkeit, Lösungen zu erstellen, die mehrere Module (Projekte) enthalten - zum Beispiel Dienstprogramm Bibliothek, die aus paar .dll Dateien bestand.Welche Konsequenzen hat das Hinzufügen von Verweisen auf C++ - Projekt in Visual Studio?

Wenn es einen Bedarf für ein Modul (A) ist eine andere (B) zu verwenden, ist es Standardmuster für diese:

  1. Fügen erforderlichen Header.
  2. Verknüpfen Sie die Ausgabebibliotheksdatei mit B (z. B. in VS: Projektkonfiguration ->Linker ->Input ->Additional Dependencies ->'B.lib').
  3. [Optional] Richten Sie die richtige Build-Reihenfolge ein (B wird also vor A erstellt).

Kürzlich begann ich mit C# zu spielen, um, weil ich mit ihm (es ist viel einfacher, als die Verwendung von C++ und externen Bibliotheken wie Qt oder wxWidgets) einige GUI-basierten Tools für meinen Motor zu entwickeln entschieden. Ich habe gelernt, dass in C# werden solche Abhängigkeiten gesetzt mit ‚Referenzen‘:

enter image description here

Ich war sehr überrascht, als ich entdeckte, dass diese Option für C++ Projekte anwendbar ist!

In der Tat, nachdem ich Beispiellösung erstellt und Abhängigkeiten auf diese Weise gesetzt hatte, hat alles gut funktioniert, ohne zusätzliche Konfiguration wie "Linker-Eingabe" oder so etwas.

Meine Frage ist: Was genau macht diese Option für C++ Projekte? Ich bin an allen Gewinnen und möglichen Kompromissen interessiert.

Ich weiß schon, dass es die Verknüpfung der Ausgabe von anderen Projekten als Abhängigkeiten verursacht. Noch etwas? Vielleicht einige Laufzeitabhängigkeiten zwischen referenzierten Modulen? Wie wirkt sich dies auf die generierte Ausgabe aus?

+0

Ein Projektverweis übernimmt automatisch die Ausgabe von der entsprechenden Build-Konfiguration des anderen Projekts (Debug-Bibliothek für Debug-Build der Anwendung usw.). Es wäre ein gutes Stück Arbeit, das manuell einzurichten. –

+0

Da Sie auch DLLs erwähnt haben, wird die Projektreferenz beide Buildausgaben, die .lib-Importbibliothek und die .DLL zur Laufzeit abrufen. –

Antwort

7

Es war ursprünglich gemeint, nur in C++/CLI-Projekten verwendet werden. Genau wie beim Hinzufügen von Verweisen zu einem C# -Projekt wählen Sie .NET-Referenzassemblys aus, die Sie zum Kompilieren des Projekts benötigen.

Aber das verwechselte sehr viele C++ - Programmierer, sie dachten, es sollte etwas allgemein Nützliches enthalten. Wahrscheinlich, weil es unter der Überschrift "Gemeinsame Eigenschaften" steht. Viele Fragen dazu.

Schnellvorlauf zu VS2010, eine Version, die nicht abgeschlossen war. Einer der wenigen Fälle, in denen ein Microsoft-Projekt den geplanten Versandtermin überschritten hat. Sie haben zusätzliche 6 Wochen Zeit, um die Fehlerliste zu bearbeiten. Aber das war nicht genug, die Funktion, die es erleichtern sollte, Abhängigkeiten zu verknüpfen, war not actually implemented oder deaktiviert.

Also entschieden sie sich bei VS2012, es anders zu machen und Add Reference auch für ein natives C/C++ Projekt nützlich zu machen. Sie wählen immer eine Projektreferenz, es muss eine statische Bibliothek oder ein DLL-Projekt sein. Eine, die eine .lib-Datei erzeugt. Und es weist automatisch den Linker an, diese .lib-Datei zu verknüpfen. Nichts anderes, es fügt einfach die .lib-Datei zur Linker-Befehlszeile hinzu. Funktioniert gut.

Update: erneut für VS2015 geändert, jetzt hat es einen Knoten Referenzen.Klicken Sie mit der rechten Maustaste darauf, um Referenzen zu einem anderen Projekt hinzuzufügen.

+1

Scheint viel klarer zu sein, als mit manueller Bearbeitung von 'Linker-Eingabe' oder' #pragma-Kommentar' zu verwirren. –

+0

"... es muss eine statische Bibliothek oder ein DLL-Projekt sein. Eines, das eine .lib-Datei erzeugt." - aber nur eine statische Bibliothek erzeugt .lib Datei, während ein DLL Projekt keine .lib Datei erzeugt, richtig? – athos

+1

Es tut, die Import-Bibliothek. Es muss von jedem Projekt verknüpft werden, das die DLL verwendet, damit der Linker weiß, dass eine Kennung in einer anderen ausführbaren Datei vorhanden ist. –