Frage zu Code Management
-
Hallo!
Ich habe zwar keine Frage zu MFC, jedoch zu Code bzw.
Projektmanagement in Visual Studio (Visual C++).Ich habe einen Solution-Ordner in dem sich mehrere
Projekte befinden. Die meisten sind Win32 Projekte
ohne MFC.Diese Projekte enthalten in ihrem jeweils eigenen
Source Ordner ALLE einen Unterordner der eine
Sammlung von Klassen enthält (.cpp/.h files).Dieser Haufen von Klassen ist in jedem Projekt gleich,
daher würde ich gerne die Redundanz loswerden.Ich hab mir gedacht ich erstelle ein neues Projekt,
das nur diese redundanten Klassen compiliert.
Und alle anderen Projekte verwenden dann irgendwie
den compilierten Code (ist das dann eine *.lib,
die ich bei denen einbinden muss?).Da in den Klassen auch WinAPI code verwendet wird,
lege ich am besten ein win32 Projekt an oder eine
win32 Console Projekt? Die WinMain bleibt dann
einfach leer?Hoffe Ihr könnt mir weiterhelfen.
Und noch ne dumme Frage zum Schluss. Ich hab gesehen,
das der Compiler für meine Projekte auch immer eine
*.lib erstellt. Befinden sich in der lib ALLE compilierten
Klassen und Methoden die es überhaupt gibt oder nur
Code der in dem Projekt auch von der Applikation
verwendet wird (sprich eine Methode die nie aufgerufen
wird, kommt auch nicht in die lib? (was ein Problem wäre,
wenn ich die lib von einem anderen Programm aus einbinden
will welches die Methode vielleicht braucht)).Danke!!
-
Achso oder muss ich statt nem win32 Projekt
irgendwie ein static library Projekt anlegen?
-
Gast2010 schrieb:
Achso oder muss ich statt nem win32 Projekt
irgendwie ein static library Projekt anlegen?Japp!
Aber Du kannst den redundanten Code auch in ein Verzeichnis legen aus dem alle die dateien in allen anderen Projekten eingefügt werden.Solution +- Common +- Projekt1 (bezieht auch Dateien aus ..\Common) +- Projekt2 (bezieht auch Dateien aus ..\Common)
-
Danke für die Antwort!
Ich hab jetzt eine static library wie folgt angelegt:
Neues Win32 Projekt -> Häkchen bei "Statis Library" (ohne precompiled headers)Compiliert auch ohne Fehler
Der Linker schmeißt allerdings 46925 warnings (!) aus
bezüglich der Xerces C++ library die ich verwende:1>xerces-depdom_2D.lib(xerces-depdom_2_8D.dll) : warning LNK4006: "public: class xercesc_2_8::DOM_NodeList __thiscall xercesc_2_8::DOM_Element::getElementsByTagName(class xercesc_2_8::DOMString const &)const " (?getElementsByTagName@DOM_Element@xercesc_2_8@@QBE?AVDOM_NodeList@2@ABVDOMString@2@@Z) already defined in xerces-depdom_2.lib(xerces-depdom_2_8.dll); second definition ignored
1>xerces-depdom_2D.lib(xerces-depdom_2_8D.dll) : warning LNK4006: "__declspec(dllimport) public: class xercesc_2_8::DOM_NodeList __thiscall xercesc_2_8::DOM_Element::getElementsByTagName(class xercesc_2_8::DOMString const &)const " (__imp_?getElementsByTagName@DOM_Element@xercesc_2_8@@QBE?AVDOM_NodeList@2@ABVDOMString@2@@Z) already defined in xerces-depdom_2.lib(xerces-depdom_2_8.dll); second definition ignored
1>xerces-depdom_2D.lib(xerces-depdom_2_8D.dll) : warning LNK4221: no public symbols found; archive member will be inaccessibleWie werde ich die los?
Offenbar sind manche Symbole schon definiert und dann gibt es noch ständig
die Meldung "no public symbols found"Danke!!
-
Tja. Da hast Du wohl die Symbole wirklich doppelt drin.
Wenn Du die in der Lib hast, musst Du die CPP Dateien die in der LIB liegen natürlich aus den anderen Projekten rausnehmen.
-
Diese Meldungen bekomme ich, wenn ich die lib compiliere.
-
Na ja ich ignorier momentan erstmal die warnings,
hab aber mal ne andere generelle Frage.Was mache ich denn jetzt in meinen anderen Projekten
(welche die lib einbinden sollen) mit den ganzen
alten #include <XYZHeader.h> Anweisungen?Der Code ist ja nun in der lib, aber wie wird das
mit den Headern gemanaged?Danke!
-
Kopier ich die *.h Dateien in meinem lib Projekt dann mit einem Post-Build-Event
oder so in einen extra ordner "inc", und setze dann in meinen anderen Projekten
bei den include Pfaden einen link zu diesem "inc" Ordner?
-
Ja, kannst du so machen.
Mache das auch immer so. Nur eben auch für die lib-Files.Aber es gibt bei mir immer nur einen "großen" Header, dass dann von ner anderen Anwendung included wird, dann noch die lib dazu und dann passt das.
-
Meine Struktur sieht meistens so aus.
-Solution +-Lib +-Bin +-Include +-Project +-Bin +-Common +-Projekt1 +-Projekt2
Die Projekte ziehen die Includes aus Common und Lib/Include
In Lib/Bin liegen die eigentlichen Libs.
in /bin werden alle Binaries erzeugt.