Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: nomorelogic - Giugno 16, 2021, 07:46:28 pm

Titolo: windres: Error: resource compiler "windres" not found, switching to external mod
Inserito da: nomorelogic - Giugno 16, 2021, 07:46:28 pm
Questo è un errore che può capitare quando si compila sotto Linux un'applicazione scritta con Lazarus per windows.
Più precisamene quando si usano le risorse e si rende necessario usare windres.exe.

Per prima cosa dobbiamo trovare in quale pacchetto la nostra distro ha messo il windres.
Su VoidLinux ad esempio possiamo usare il comando xlocate:
Codice: [Seleziona]
$ xlocate windres
xlocate: database outdated, please run xlocate -S.
avr-binutils-2.32_1 /usr/share/man/man1/avr-windres.1
cmake-3.20.3_1 /usr/share/cmake-3.20/Modules/Platform/CYGWIN-windres.cmake
cmake-3.20.3_1 /usr/share/cmake-3.20/Modules/Platform/Windows-windres.cmake
cmake-bootstrap-3.20.2_1 /usr/share/cmake-bootstrap/Modules/Platform/CYGWIN-windres.cmake
cmake-bootstrap-3.20.2_1 /usr/share/cmake-bootstrap/Modules/Platform/Windows-windres.cmake
cross-arm-none-eabi-binutils-2.32_2 /usr/share/man/man1/arm-none-eabi-windres.1
cross-i686-w64-mingw32-8.0.0_1 /usr/bin/i686-w64-mingw32-windres
cross-or1k-none-elf-binutils-2.35_1 /usr/share/man/man1/or1k-none-elf-windres.1
cross-x86_64-w64-mingw32-8.0.0_1 /usr/bin/x86_64-w64-mingw32-windres
msp430-toolchain-3.05.00.00_2 /usr/msp430/share/man/man1/msp430-windres.1

Una volta individuato il pacchetto che ci interessa, lo installiamo (se trovate la versione mingw32 installate quella senza pensarci 2 volte):
Codice: [Seleziona]
sudo xbps-install -S cross-x86_64-w64-mingw32


Una volta fatto questo dobbiamo permettere a Lazarus di trovare il binario.
Non è scontato in quanto il binario ha un nome diverso a seconda dell'architettura.

Ci sono diverse soluzioni ovviamente (non ultima un copia/incolla/rinomina).

Io ho preferito fare un link simbolico in un percorso già incluso nella variabile $PATH.
Quindi:
Codice: [Seleziona]
ln -s /usr/bin/x86_64-w64-mingw32-windres /sbin

Ora la compilazione con Lazarus andrà (dovrebbe :) ) andare a buon fine.


Titolo: Re:windres: Error: resource compiler "windres" not found, switching to external mod
Inserito da: xinyiman - Giugno 16, 2021, 11:15:10 pm
Stesso problema su Mac OS X. Al momento non ho ancora risolto. Ma ho fatto passi avanti.

Per prima cosa uso MacPorts per installare windres con il comando

sudo port install x86_64-w64-mingw32-binutils

Poi verifico che sia stato installato con

x86_64-w64-mingw32-windres --version

A me ha installato il programma nella directory: /opt/local/bin/x86_64-w64-mingw32-windres

Ciò nonostante lazarus non compila. Nei prossimi giorni approfondisco.
Titolo: Re:windres: Error: resource compiler "windres" not found, switching to external mod
Inserito da: nomorelogic - Giugno 17, 2021, 09:03:53 am
A me ha installato il programma nella directory: /opt/local/bin/x86_64-w64-mingw32-windres
Ciò nonostante lazarus non compila. Nei prossimi giorni approfondisco.

Probabilmente è lo stesso problema che ho avuto sotto linux, a me lo aveva installato in /usr/bin/x86_64-w64-mingw32-windres per questo ho fatto il link simbolico.
In pratica il compilatore cerca il nome generico "windres" mentre a te lo ha installato come "x86_64-w64-mingw32-windres" in "/opt/...".

Devi fare in modo che "x86_64-w64-mingw32-windres" sia in uno dei percorsi di ricerca del sistema operativo e che si chiami "windres".
Potrebbe anche funzionare il fatto di copiare quel binario nella stessa cartella di Lazarus e/o fpc e rinominarlo come "windres".
Titolo: Re:windres: Error: resource compiler "windres" not found, switching to external mod
Inserito da: DragoRosso - Giugno 17, 2021, 11:01:19 pm
Si può evitare l'uso di windres inserendo i file "resource" quali bitmap, musica o altro (qualsiasi dato contenuto in un file) inserendoli direttamente nelle opzioni di progetto. In questo modo verranno compilati e linkati al programma su qualsiasi piattaforma senza l'uso di windres.

Ciò ovviamente toglie potenzialità, in quanto i file RC (cioè i descrittori esterni delle risorse) potevano essere selezionati ad esempio tramite delle $IFDEF a seconda della piattaforma.

Nota bene: sebbene lo streaming di accesso alle risorse è normalmente disponibile con procedura pubblica di vari componenti, consiglio vivamente invece di usare TResourceStream e poi usare la procedura pubblica LoadFormStream del componente.
Questo perchè nel passato ho avuto problemi di compatibilità sugli streaming delle risorse chiamati direttamente dal componente.

Ciao