Libs für jede C++ Datei linken?
-
Hi,
Muss ich für jede *.cpp-Datei (in meinem Projekt), die eine von mir erstellte DLL bzw deren Lib benutzt, die Library jedes mal mit #pragma comment(lib, "BIB.lib") linken bzw kann ich das, bzw. ist das sinnvoll ?
ThXX

-
Verstehe Deine Frage nicht...
CPP-Dateien linken nicht gegen irgendwelche LIB-Dateien...Mit dem #pragma comment(lib, ...) teilst Du nur dem Linker mit, dass er noch diese LIB-Datei dazulinken soll. Diese definition gehört in eine H-Datei und hat mit der CPP-Datei nix zu tun...
-
Jochen Kalmbach schrieb:
[..] #pragma comment(lib, ...) [..] Diese definition gehört in eine H-Datei und hat mit der CPP-Datei nix zu tun...
Wieso gehört das in die Headerdatei?
Ich linke Libs, welche nur von einer bestimmten Klasse und nicht projektübergreifend verwendet werden, über #pragma. Damit kann ich Klasse anderen Projekten hinzufügen, ohne die Projekteinstellungen ändern zu müssen. Das #pragma schreibe ich in die CPP-Datei, da erst dort die Lib-Fkt. aufgerufen werden. Was spricht dagegen?
-
I.d.R. verwendest Du ja (min.) eine H-Datei für die LIB, oder?
Somit sollte der LIB-Hersteller in diese von ihm gelieferte H-Datei auch ein #pragma comment(lib, ...) einfügen, da ja eine Verwendung der H-Datei ohne linken der LIB-Datei keinen Sinn macht.Wenn der Hersteller dies natürlich versäumt hat, kannst Du es in eine cpp-Datei reinmachen... aber das ist IMHO ein Fehler des LIB-Herstellers.
Auch verhindert ein #pragma comment(lib, ...) in der H-Datei des Herstellers ein einbinden einer "falschen" LIB, wenn es z.B. für verschiedene VS-versionen, CRT-Versionen (MT/MT, UNICODE/ANSI, usw.) unterschiedliche LIBs gibt. Dies kann der Hersteller ganz einfach via #if entsprechend in der H-Datei realisieren...
So sieht z.B: bei unserer H-Datei für eine LIB dieser Erintrag in der H-Datei wie folgt aus:
#ifndef _LIB // Prgama für den Linker, damit er die Library einbindet #ifdef _UNICODE #ifdef _DEBUG #ifdef _MANAGED #pragma comment (lib, "NameDerLib_umd.lib") #else #pragma comment (lib, "NameDerLib_ud.lib") #endif #else #pragma comment (lib, "NameDerLib_u.lib") #endif #else // ANSI #ifdef _DEBUG #pragma comment (lib, "NameDerLib_d.lib") #else #pragma comment (lib, "NameDerLib_.lib") #endif #endif #endif
-
So macht das Sinn, ist aber nicht immer so.

Hatte das Problem von der anderen Perspektive (Sicht des Anwenders) gesehen. Wenn natürlich der Hersteller das pragma ins seine H-Datei schreibt, kann der Anwender es sich dann sparen.
-
Hallo zusammen, erstmal danke für die Antworten, ...
Ich bin mir nicht ganz sicher, ob Jochen mein Problem jetzt genau erfasst hat...vllt. sollte ich noch n bissl Bkgnd-Wissen liefern:
Also ich habe mir eine Klasse CDemo geschrieben, diese habe ich in eine DLL exportiert...in meinem Hauptprogramm exisitieren jetzt einige *.cpp-Dateien, die Gebrauch von der Klasse machen...Deshalb inkludieren alle (diese) cpp-Dateien den Header der DLL. Dieser Header enthält auch ein #pragma comment... und linkt somit die richtige Library (Wenn man so will: Ich bin der Hersteller, der den 'Lib-Lade-Befehl' in die Header gesetzt hat^^). In meinem Projekt existieren nun sehr viele cpp-Dateien, somit, kommt der Compiler mehrmals an den Befehl #pragma comment... ! Ist das schlimm/nachteilhaft/etc. ...? Dann hab ich mal btw. noch eine weitere kleine Frage:
Muss in einer DLL eine DllMain()-Funktion existieren...Bei meiner derzeitigen 'Komposition'^^ habe ich drei Cpp-Dateien, in denen jewals eine Klassen definition enthalten ist und eine Header, die so zusagen die Prototypen der Klassen enthält (+ ne *.rc und ne Resource.h für die Versionsinfos)...ist das so 'ok' bzw. 'gebräuchlich' oder würdest du mir davon abraten?So, schonmal ein riesen großes Dankeschön sowohl für die (hoffentlich) nächste Antwort, als auch für die letzten!

-
HelpMePlz schrieb:
In meinem Projekt existieren nun sehr viele cpp-Dateien, somit, kommt der Compiler mehrmals an den Befehl #pragma comment... ! Ist das schlimm/nachteilhaft/etc. ...?
Das stört nicht.
HelpMePlz schrieb:
Muss in einer DLL eine DllMain()-Funktion existieren...
Theoretisch nicht. Wenn Du die CRT verwendest, liefert aber zumindest die CRT eine "DllMain" mit. Diese würde dann Deine DllMain aufrufen...