![]() |
Compile LINUX , cannot open shlwapi.dll
beim compilieren für LINUX bekomme ich diese Fehlermeldung :
Delphi-Quellcode:
wie löse ich dieses Problem , wer ist für diese DLL verantwortlich ?
[DCC Error] E2597 C:\Program Files (x86)\Embarcadero\Studio\20.0\bin\ld-linux.exe: error: cannot open shlwapi.dll: No such file or directory
[DCC Fatal Error] F2588 Linker error code: 1 ($00000001) |
AW: Compile LINUX , cannot open shlwapi.dll
Die DLL gehört zu Windows. Wenn diese bei dir nicht vorhanden ist, dürfte eigentlich Windows kaum noch funktionieren. Von daher ist bei dir wohl eher der Systempfad defekt.
Prüfen kannst du das indem du die Umgebungsvariable PATH prüfst oder mit dem Process Monitor prüfst wo diese DLL gesucht wird und was damit passiert. |
AW: Compile LINUX , cannot open shlwapi.dll
Hallo,
fang an mit einem leeren Projekt, dann deine Units (ohne Code) nach und nach einbinden. |
AW: Compile LINUX , cannot open shlwapi.dll
Zitat:
Hat wohl irgendwo eine Usage auf eine reine Windows-Unit. Evtl. mal die Compilerwarnung dafür aktivieren. |
AW: Compile LINUX , cannot open shlwapi.dll
Zitat:
Wenn ich für Windows kompiliere, muss eine eingebundene DLL ja beim Kompilieren auf dem System gar nicht vorhanden sein (wozu auch). Für mich sieht es eher so aus als ob der Linuxcompiler die DLL für das Ermitteln von Pfadangaben oder ähnlichem selbst versucht zu laden. Aber es kann natürlich alles sein. |
AW: Compile LINUX , cannot open shlwapi.dll
welche windows unit könnte ich in meinen source code eingebunden haben damit die shlwapi.dll beim compilieren aufgerufen wird ?
ich konnte ja schon mal für LINUX und Windows kompilieren ..... |
AW: Compile LINUX , cannot open shlwapi.dll
Hallo,
siehe mein Post (#3). Wir kennen deinen Quellcode nicht. Klappt denn ein komplett leeres Programm? |
AW: Compile LINUX , cannot open shlwapi.dll
@hoika
< 1 Mio Zeilen code ~ 1000 units die sich x mal untereinander einbinden ............. wenn ich wüsste was die dll macht könnte ich den Suchraum einschränken .... |
AW: Compile LINUX , cannot open shlwapi.dll
![]() ![]() ![]() Grob: Kappselt gaaaaanz vieeeeel von der Windows-Api. Dürfte für Linux absolut uninteressant sein. Da müssen dann die entsprechenden "Linux-Gegenstücke" genutzt werden. Mal nur 'ne Vermutung: Irgendwo fehlt ein Kompilerschalter, der für die Unterscheidung zwischen Windows und Linux zuständig ist. EmbeddedWB nutzt die Dll z. B., ebenso die JCL. Achso: Es gibt auch 'ne Unit shlwapi (Zumindest in den Quellen zu ![]() Ist die irgendwo unter Deinen 1000? |
AW: Compile LINUX , cannot open shlwapi.dll
Sicher dass ihr an der richtigen Stelle sucht?
Beim Kompilieren werden die eingebundenen .DLL (Windows) bzw. .SO (Linux) niemals geladen, also ist es "erstmal" egal falls im Quellcode irgendwo eine Referenz darauf stünde, weil z.B. ein IFDEF fehlt. Die Fehlermeldung in #1 sieht eher so aus, als wenn sie aus der ld-linux.exe kommt. |
AW: Compile LINUX , cannot open shlwapi.dll
Zitat:
Zitat:
Zitat:
![]() Meine Interpretation des Fehler geht dahin, dass der Linker meint, er müsse die DLL beim Linken mit einbinden (z. B. als Resource oder was auch immer), auch wenn das eigentlich vollständiger Humbug sein dürfte. Was passiert denn, wenn ein neues Projekt für Linux kompiliert werden soll. Tritt der Fehler dann auch auf? Müsste ja eigentlich, wenn die ld-linux.exe die DLL für sich selbst, also die eigene Funktionalität, benötigt. (Achso: Muss ja nicht unbedingt sein, dass die DLL grundsätzlich geladen werden muss, sondern nur, wenn 'ne Routine aus ihr benötigt wird. Von daher ist so ein Test auch nicht zwingend verlässlich.) |
AW: Compile LINUX , cannot open shlwapi.dll
Hallo,
und noch mal ... Klappt denn ein komplett leeres (VCL-) Programm? < 1 Mio. puh, dann geht das ja ;) > 1 Mio. wäre in der Tat zu aufwendig |
AW: Compile LINUX , cannot open shlwapi.dll
@
was müsste ich machen wenn Zitat:
|
AW: Compile LINUX , cannot open shlwapi.dll
Zitat:
![]() ![]() Ach ja (Einfügung): ripgrep läßt sich im Handumdrehen auf dem eigenen Rechner bauen, sofern man sich mit ![]() Und wenn sich Delphianer zusammentun, könnte es demnächst sogar Unterstützung in ![]() ![]() Zitat:
Soweit ich mich entsinne, brachte auch Delphi Werkzeuge mit um den Inhalt (Symbole) von Objektdateien anzuschauen. Man könnte also quasi auch "ganz simpel" mit einem Tool dieser Art die Symbole in eine Textdatei ausgeben lassen und danach mit simpler Textsuche den Verweis auf die shlwapi aufspüren. Ich habe sehr gute Erfahrungen mit ![]() Da der Linker laut Namensgebung vielleicht sogar der von Binutils ist (ld-linux.exe --version), würde ich mal gucken ob nicht vielleicht ein passendes objdump beiliegt. Und falls nicht, könnte man mal auf's Gratewohl per objdump/nm (usw.) auf einem Linux versuchen ob das Format bekannt ist. Da für Linux gebaut wird, gehe ich mal davon aus, daß ein Linux vorhanden ist. :mrgreen: Letztens habe ich noch andernorts ![]() |
AW: Compile LINUX , cannot open shlwapi.dll
Am sinnvollsten wäre doch erst einmal wie ich in der ersten Antwort geschrieben hatte festzustellen wo eigentlich das Problem liegt. Sprich einfach mal die 5 Minuten zu investieren und mit dem Process Monitor zu schauen was mit der Datei eigentlich passiert. Vielleicht wird die ja schlicht wirklich nicht gefunden, weil der Systempfad kaputt ist oder ähnliches...
|
AW: Compile LINUX , cannot open shlwapi.dll
Zitat:
Zitat:
![]() ![]() ![]() Das mal nachzuschauen ist aber in der Tat billig und schnell getan und ich muß sagen, daß ich beim Schreiben dieser Antwort mehr und mehr deinen Vorschlag unterstütze. Ich will kurz umreißen warum. Angenommen diese ld-linux.exe linkt gegen die Cygwin-DLL o.ä. dann weiß ich aus eigener Erfahrung, daß die Umgebungsvariablen, insbesondere der Pfad zwischen Backslash und Slash hin- und herkonvertiert werden. Ich hatte bereits selbst denn Fall, daß bei einer großen Anzahl Variablen und großer Größe der einzelnen Werte diese Konvertierung verlustbehaftet war. Bei mir führte dies zu einem Fehler der zum Nichtauffinden einer (Nicht-System-)DLL. Zwar halte ich es aufgrund des oben beschriebenen Systemverhaltens für unwahrscheinlicher, daß überhaupt nach dieser DLL gesucht wird und würde eher davon ausgehen, daß der Linker meint gegen diese DLL linken zu wollen, aber schnell überprüfen ist trotzdem gut. Sehen sollte man das daran ob die Datei shlwapi.dll in einem Verzeichnis gesucht wird wo die ganzen Objektdateien und Shared Objekts des Zielsystems liegen ("sysroot" im GCC-Jargon). Process Monitor sollte das zeigen. @bernhard_LA: ich bin also bei @jaenicke. Bitte erst einmal abklären! Nachtrag: ![]() |
AW: Compile LINUX , cannot open shlwapi.dll
Liste der Anhänge anzeigen (Anzahl: 1)
@ Check#1
a) die shlwapi.dll ist auf meinem System x mal vorhanden b) wenn ich meine app anstelle von Target = LINUX auf Target = WIN64 umstelle funktioniert alles bestens @ Check#2 Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlS et\Control\Session Manager\KnownDLLs , hier ist diese dll eingetragen, scheint alles mit meinem System OK zu sein @ Check#3 andere Programme, weniger Komplex, andere units kann ich weiterhin für LINUX compilieren, PA Server etc ... sieht eigentlich gut aus @Check#4 ich habe in einer anderen App einen Linker error #1 ohne Angabe einer DLL erzeugt ... @ Check#5 über {$IFDEF ...} kann ich zwischen FMX und VCL , Firedac und ADO .... und diversen Featuren hin und her switchen, ich vermute ganz stark, irgendwo ist halt der Link auf eine Win only DLL, Klasse eingebaut , eine unit steht im verkehrten ifdef block, nur die Suchstrategie hat bisher nicht zur Lösung geführt :-( |
AW: Compile LINUX , cannot open shlwapi.dll
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Aber schau dir doch mal bitte an, was ich erwähnt hatte. Nach kurzer Recherche (ohne installiertes Delphi) fand ich ![]() Zitat:
|
AW: Compile LINUX , cannot open shlwapi.dll
Zitat:
Wie der Linux-Linker arbeitet weiß ich nicht, es kann natürlich auch sein, dass man das so nicht sieht, aber einen Versuch ist es wert... |
AW: Compile LINUX , cannot open shlwapi.dll
Zitat:
![]() ![]() Ich finde daß jaenickes Idee einen Versuch wert ist. Im Vergleich zum bisher betriebenen Aufwand ist das minimaler Aufwand, aber könnte ne Menge Zeit sparen. |
AW: Compile LINUX , cannot open shlwapi.dll
Liste der Anhänge anzeigen (Anzahl: 1)
mit procmon konnte ich einen ersten Fehler tatsächlich finden, Active X stand in einer unit.....; Diese unit ist nun entfernt, nur leider immer noch der selbe Fehler ,
vermutlich aus einer weiteren unit.
Delphi-Quellcode:
Nur hilft mit procmon aktuell nicht weiter, hier der aktuelle dump, die letzten Zeilen bis zum Abbruch :-(
[DCC Error] E2597 C:\Program Files (x86)\Embarcadero\Studio\20.0\bin\ld-linux.exe: error: cannot open shlwapi.dll: No such file or directory
|
AW: Compile LINUX , cannot open shlwapi.dll
Hallo,
such mal per Grep nach SH*, z.B. SHDeleteKey in deinem Code. Hier ![]() ist eine Auflistung aller Funktionen. PS: Hattest du denn mal ein neues, leeres Projekt getestet? |
AW: Compile LINUX , cannot open shlwapi.dll
jede Einbindung von Windows units in diesem Stil, speziell ShlObj, unterbunden
via grep shlobj überprüft
Delphi-Quellcode:
ich kann eine ganz Reihe von anderen Anwendungen weiterhin auch für LINUX deloyen ....{$IFDEF LINUX} Myunit_TRegistry {$ENDIF} {$IFDEF MSWINDOWS} Registry, Windows, ShlObj; {$endif} |
AW: Compile LINUX , cannot open shlwapi.dll
Hallo,
und die shlwapi selber mal per grep gesucht, das ist ja auch eine normale Delphi-Unit? Vielleicht lungert ja auch nur eine alte DCU bei dir rum? |
AW: Compile LINUX , cannot open shlwapi.dll
Jetzt verrate doch mal was da sonst noch so in C:\Program Files (x86)\Embarcadero\Studio\20.0\bin rumlungert? Wie ich vorher schon getippt hab, könnte es sich um die Binutils handeln und dann könnte man da mit der Bash for Git rangehen so ala:
Code:
Beschreibung: Finde alle Dateien (-type f) mit einem Namen (-name) der auf '*.o' (vielleicht bei euch *.obj?) paßt und pipe die Ausgabe in eine while-Schleife (while; do ...; done). Lies jede Zeile in die Variable fname (read fname) und führe aus objdump (aus Binutils) und sage diesem alle Symbole auszugeben (-t) die in der Datei "$fname" gefunden werden. Pipe diese Ausgabe in eine Datei die auf dem ursprünglichen Namen basiert (abgeschnittener Pfad) und hänge .objdump.txt dran (die Dateien landen im aktuellen Verzeichnis!). Durchsuche wiederum diese Ausgabe ohne Beachtung von Groß- und Kleinschreibung (-i) mithilfe von grep nach shlwapi ...
find -type f -name '*.o'|while read fname; do objdump -t "$fname"|tee "${fname##*/}.objdump.txt"|grep -i shlwapi; done
Ich habe deutlich mehr Zeit damit verbracht diese Beschreibung einzutippen als den Befehl. Statt am Ende nach shlwapi zu suchen kann man auch Path und SH suchen ... vielleicht dann lieber mit "grep -Pi" und in Form von '\WPath\w+' bzw. '\WSH\w+' ... Die ganze Übung kann doch nicht so schwierig sein, solange der Compiler vor dem Linken Objektdateien ausspuckt. Ich habe leider keine so aktuelle Delphiversion zur Verfügung um das erster Hand zu testen. |
AW: Compile LINUX , cannot open shlwapi.dll
Problem gelöst .... der Übeltäter // unit gefunden ..... :P
anstelle von grep die Funktion "suche in Files /directories" von Delphi verwendet, eigentlich ganz einfach :-) alles und dabei noch 100 Referenzen in diversen Programmstellen auf die unit windows entfernt , mit procmon und einem Filter auf id_linux auch noch das eine / andere Problem entdeckt ... Danke |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz