uss ich alle abhängigen DLLs in den bin-Ordner des JDK lege
Meine Java-Anwendung hängt von einer DLL ab, und diese DLLdes Weitere kommt drauf anlibstdc++-6.dll
.
Ich versuchte zu
placed thelibstdc++-6.dll
in einem Ordnerund legen Sie den Ordner in% PATH% Dann treffe ich diejava.lang.Unsatisfied LinkError: The specified procedure could not be found
beim Starten der Anwendung von Eclipse.
Aber wenn ich daslibstdc++-6.dll
in dasJDK's bin folder
, sagenC:\Java\jdk1.6.0_45_32bit\bin
. Es funktioniert gut
Aber ich möchte den JDK-Ordner nicht verschmutzen. Ich erinnere mich, dass Windows% PATH% durchsucht, um abhängige DLLs zu finden. Warum kann ich% PATH% in dieser Ausgabe nicht verwenden?
Update 1In Windows gibt es 2 verschiedene% PATH% -Umgebungsvariablen.
User VariablenSystemvariablenIch habe geradeversehentlic finde das
Wenn ich den Ordner der DLL auf Benutzer% PATH% lege, kann er nicht gefunden werden.
Wenn ich den Ordner der DLL auf System% PATH% lege, funktioniert es.
Warum
Update 2Von diesem Thread inspiriert: System versus Benutzer-PATH-Umgebungsvariable ... winmerge funktioniert nur, wenn ich den Pfad zum Benutzer PATH @ hinzufüg
Ich frage mich, ob mein Benutzer% Path% vielleicht @ iszu lan. Also habe ich den Ordnerpfad mit meiner abhängigen DLL aus dem @ verschobeEnd von Benutzer% PATH% anAnfan. Es funktioniert jetzt
Zunächst komme ich zu dem Schluss, dass jemand, der den DLL-Suchalgorithmus von Windows implementiert hat, ein Kürzungsproblem hat. Und ichfas Betrachten Sie es als einen weiteren nervigen Windows-Bug.
Aber ich habe eine andere Windows-Anwendung geschrieben, die ähnliche DLL-Abhängigkeiten aufweist, um meine Vermutung zu bestätigen. Diese Anwendung funktioniert gut! Also muss ich meine Schlussfolgerung überprüfen.
Ich habe meinen Benutzer% PATH% -Eintrag nacheinander überprüft und den Ordner an jedem möglichen Speicherort abgelegt. Und schließlich finde ich dasUrsach.
Ich habe einC:\MinGW\bin
-Eintrag in Benutzer% PATH%, der zufällig ein @ enthälibstdc++-6.dll (977KB)
aber leider nicht kompatibel mit der ich brauche(825KB)
. Es funktioniert nur, wenn ich meinen Ordner vor MinGW platziere. Es ist also tatsächlich eine DLL-Kollision während der% PATH% -Auflösung.
Jetzt scheint das Problem behoben zu sein. Aber es kommt noch eine Frage auf, muss ich hin und her wechseln, wenn ich sowohl meine DLL als auch das MinGW verwenden möchte?
Update 3Bitte überprüfen Sie den Kommentar von @AndyThomas. Er erwähnte mitSystem.loadLibrary()
für direkte und indirekte DLLs. Auf diese Weise brauchen wir uns nur um das @ zu kümmerjava.library.path
Eigentum. Ich denke, das ist eine endgültige Lösung.