DLL statisch linken
-
Hallo,
ich habe ein Projekt (Winamp plugin), dass eine DLL statisch linkt (Intel JPEg Library / ijl15.dll, ijl.h, ijl15.lib, ijl15l.lib).
Habe nun das Projekt neu erstellt (bzw. ein schon bestehendes Projekt mit meinem Code erweitert), und die DLL wird nun dynamisch geladen.
Möchte nun wieder die DLL wieder statisch linken, habe aber keine Ahnung, was ich am Projekt ändern muss (Visual C++ 2008).
Ich habe die .lib und .h Datei dem Projekt zugefügt und die .lib-Dateien in den Linker-Optionen (Input) hinzugefügt.Vielleicht kann mir ja jemand weiterhelfen...
Gruß, Christian
Hier die command line options, vielleicht sagt das jemandem was:
C/C++
/Od /I "../Wasabi" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_USRDLL" /D "ML_HTTP_EXPORTS" /D "_WIN32_WINNT=0x400" /D "_VC80_UPGRADE=0x0710" /D "_WINDLL" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /MTd /Fo"Debug\\" /Fd"Debug\vc90.pdb" /W3 /nologo /c /ZI /TP /errorReport:prompt
Linker
/OUT:"C:\Programme/winamp2/plugins/ml_nowplaying2.dll" /INCREMENTAL /NOLOGO /DLL /MANIFEST /MANIFESTFILE:"Debug\ml_nowplaying2.dll.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"Debug/ml_http.pdb" /SUBSYSTEM:WINDOWS /DYNAMICBASE:NO /IMPLIB:"Debug/ml_http.lib" /MACHINE:X86 /ERRORREPORT:PROMPT shlwapi.lib Tools\ijl15.lib Tools\ijl15l.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
-
Wenn du den Code der DLL hast, kannst du sie mit "Target .lib" (Projekteinstellungen) als statische Library kompilieren und in dein Programm linken. Wenn du den Code nicht hast, wirst du wohl die DLL mitliefern müssen.
-
Danke erstmal...
Was meinst du mit Code?
Ich habe die Dateien der Bibliothek, die ich einbinden will: ijl.h, ijl15.lib und ijl15l.lib .
Das muss wohl ausreichen, da ich früher auch nicht mehr gebraucht habe.Mein Projekt soll allerdings als 'normale' DLL (dynamisch) generiert werden (ich denke, dass ist das, was Target meint).
Wo ist diese Einstellung zu finden? Direkt in der Command Line?
-
Ganz verstehe ich nicht, was du willst, aber wenn du die Lib bei den Abhängigkeiten einfügst, den Header an der passenden Stelle inkludierst, sollte es funktionieren.
Da ich nicht sicher bin, dass wir beide das gleiche meinen:
Du brauchst auch weiterhin die DLL bei deiner EXE! Nur kommen die Funktionseinsprünge jetzt aus der lib und müssen nicht mehr mit GetProcAddress geladen werden.
-
Bin leider noch recht Newbie...
Ich versuch's nochmal zu erklären:
Mein Plugin ist eine DLL, die von Winamp geladen wird.
Ich benutze in meinem Plugin eine Library von Intel (Intel JPEG Library). Diese hat 3 Files, die ich im "alten" Projekt verwendet habe: ijl.h, ijl15.lib und ijl15l.lib, wobei die beiden lib's sich glaube ich nur im Funktionsumfang unterscheiden. Das "alte" Projekt habe ich immer ohne die dazugehörige "ijl15.dll" ausgeliefert.
Wenn ich meine DLL nun im "neuen" Projekt kompiliere, wird beim Starten von Winamp, sobald meine DLL geladen wird, die Meldung angezeigt "Die Anwendung konnte nicht gestartet werden, weil ijl15.dll nicht gefunden wurde. Neuinstallation der Anwendung könnte das Problem beheben.", die natürlich verschwindet, sobald ich die "ijl15.dll" in system32 kopiere.
Ich würde nun gerne das "neue" Projekt so kompilieren, dass die Anwendung läuft, ohne die "ijl15.dll" dynamisch zu benutzen, sondern statisch (also ohne "Installation" der DLL ins system32-Verzeichnis).
Das das irgendwie funktionieren muss ist klar, da das "alte" Projekt auch ohne die "ijl15.dll" läuft.
Hatte übrigens damals auch einiges an den Projekteinstellungen ändern müssen, damit das ganze funktioniert hat. Ist allerdings schon ein paar Jahre her...
Hoffe, mein Problem ist jetzt klarer.
-
Geht's evtl wenn du nur die ijl15l.lib dazulinkst, die andere also weglässt?
-
3.5 sek google
Third, an additional option would link the much larger ijl15l.lib library in lieu of the smaller ijl15.lib link library. This static library increases the stack size and would ignore potential ijl15l.lib DLL upgrades from Intel. If we wanted new JPEG functionality from the ijl15.dll, we would have to rebuild and test again.
-
Die Seite habe ich schon gesehen, allerdings hat mir das ganze nicht allzuviel gesagt.
Habe jetzt mal, wie geraten, die ijl15.lib einfach rausgeschmissen aus dem Projekt und beide libs aus den Linker/Input-Optionen.
Und es scheint tatsächlich zu funktionieren.Thanks
-
peroni schrieb:
Hoffe, mein Problem ist jetzt klarer.
Jep, ist es.
Es gibt zwei Varianten, Bibliotheken zu deinem Projekt zu linken. Einmal dynamisch, d.h. der Bibliothekscode steckt in der DLL. Hierbei hast du in der kleinen Lib-Datei nur die Einsprungadressen für die DLL, die in deinem Programm eingetragen werden, damit es die DLL nutzen kann.
Die andere Variante wäre statisch, dann steckt der ganze Bibliothekscode in der Lib, die zu deinem Programm hinzugefügt wird. Hierbei wird der ganze Code mit in deine EXE gelinkt, d.h. du brauchst nur noch die EXE auszuliefern.
War am Anfang etwas durch deine Formulierung irritiert. Du linkst ja nicht die DLL statisch, sondern die Bibliothek.
-
Ja, jetzt ist es auch für mich klarer