Oppure

Loading
16/01/21 12:48
Carlo
E' qualche mese che mi diverto a scrivere semplicissimi programmi in C, e saltuariamente in C++. Compilo con MinGW, direttamente dall'IDE, e i programmi vengono eseguiti correttamente.
Se provo ad eseguire l'EXE che viene creato dal compilatore nella cartella Debug o Release, il programma non parte e funziona solo se metto le dll richieste, una che viene sempre richiesta è: libmingwex-4.dll, ma in base agli include usati ne possono essere richieste altre.
Che flag devo inserire in fase di compilazione per fare in modo che l'eseguibile contenga tutte le risorse necessarie?
In CODE::BLOCKS dove va inserito il flag?
Setting/Compiler/Global compiler setting/Compiler setting/Other compiler option?
Grazie.
Ultima modifica effettuata da Carlo 28/01/21 9:03
in programmazione tutto è permesso
16/01/21 14:27
AldoBaldo
Non sono mai incappato nel comportamento che descrivi, quindi non saprei.

Ma... quando lanci il file .exe ti viene segnalato un errore? Da dove proviene quell'errore, se non lo hai impostato tu nel programma? Dal sistema operativo? Da qualche porzione di codice che il compilatore ha inserito in automatico nel programma? Come si presenta il testo della segnalazione di errore? Sotto forma di finestra o come scritta nella console? Cosa dice, esattamente, il testo della segnalazione d'errore?

Puoi dare più informazioni, per favore?
MAGARI mi viene qualche idea (più probabile no che si).
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
16/01/21 18:14
Carlo
Intanto ribadisco che se la compilazione sia in release che in debug la eseguo da codeblocks (F9), tutto funziona.
Se apro la cartella ...bin\release\prog.exe e lancio l'eseguibile mi appare: "Impossibile avviare il programma perché libmingwex-4.dll non è presente nel computer. Per risolvere il problema, provare a reinstallare il programma."
nella foto allegata ho cliccato due volte sull'eseguibile HelloWorld.

Se aggiungo la dll poi il programma funziona...

Su codeblocks il flag del compilatore gcc ce l'ho impostato così:
Name: Have gcc follow the 2017 ISO C language standard
Compiler flag: -std=c17
Linker flag:
Category: General
Check against:
Check message:
Superseed: -std=c90 -std=c99 -std=c11 -ansi
Exlusive: False

Nelle variabili d'ambiente di Win ho il path di MinGW configurato:
Nome variabile: MinGW
Valore variabile: C:\minGW\bin\
Ultima modifica effettuata da Carlo 16/01/21 18:26
in programmazione tutto è permesso
17/01/21 8:22
Thejuster
Non sono un esperto del C++ magari posso dire una cavolata.
In Qt C++ succede la stessa cosa ma risolvo copiando le librerie che mancano dalla cartella del Qt
e le incollo nella stessa cartella dell'eseguibile.

Forse hai qualche opzione del compilatore che non compila le librerie con all'eseguibile non saprei la sparo così.
Prova a copiare la libreria libmingwex-4.dll contenuta nella cartella mingw
mire.forumfree.it/ - Mire Engine
C# UI Designer
17/01/21 10:26
AldoBaldo
Premesso che non uso l'ultima versione di Code::Blocks, non ho trovato la dll che indichi, però ho trovato la sua versione statica. Questo mi porta a lasciarmi andare ad una SUPPOSIZIONE: puoi provare a vedere se la cosa si risolve collegando la versione statica (quella con estensione .a, che però nel Code::Blocks che uso io NON ha "-4" nella parte terminale del nome e potrebbe anche essere tutta un'altra cosa).

Un'altra SUPPOSIZIONE: potrebbe cambiare qualcosa disattivando C17 e usando una versione precedente? magari è un'impostazione nuova e soggetta a qualche difetto non ancora risolto (ricordi quando provai a usare l'ultimo Code::Blocks e dovetti tornare alla versione precedente perché gcc era male impostato e non funzionava?). Magari, eh...

A me sembra davvero strano che ti venga chiesto di collegare una libreria dinamica per un programma per console.
Ultima modifica effettuata da AldoBaldo 17/01/21 10:28
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
17/01/21 13:04
Carlo
Postato originariamente da Thejuster:
Prova a copiare la libreria libmingwex-4.dll contenuta nella cartella mingw

Come già detto se aggiungo (copio) le dll richieste i programmi funzionano.
Come dice AldoBaldo, mi sembra strano che per un programma console in C mi devo portare dietro delle dll...

Postato originariamente da AldoBaldo:
puoi provare a vedere se la cosa si risolve collegando la versione statica (quella con estensione .a, che però nel Code::Blocks che uso io NON ha "-4" nella parte terminale del nome e potrebbe anche essere tutta un'altra cosa).

come si collega?
la libreria c:\MinGW\lib\libmingwex.a ce l'ho!

Nella tua cartella ... MinGW\bin libmingwex-4.dll non esiste? che versione hai di gcc? io ho la 9.2.0-2

Per vedere tutte le versioni dei componenti installati di MinGW lancio: c:\MinGW\bin\mingw-get.exe
vedi allegato.

Postato originariamente da AldoBaldo:
Un'altra SUPPOSIZIONE: potrebbe cambiare qualcosa disattivando C17 e usando una versione precedente? magari è un'impostazione nuova e soggetta a qualche difetto non ancora risolto (ricordi quando provai a usare l'ultimo Code::Blocks e dovetti tornare alla versione precedente perché gcc era male impostato e non funzionava?). Magari, eh...

Ricordo benissimo.
Ho provato a compilare in C11, C99 e C90; non cambia nulla.

se copio libmingwex-4.dll dentro a windows\system32 funziona!

Questo significa che le mie variabili d'ambiente (path) per qualche motivo che controllerò non fanno il loro dovere.

Ma anche se riuscirò a far funzionare la variabile d'ambiente, la domanda primaria resta: come si possono inglobare le librerie nell'eseguibile?
anche perché se distribuisco l'eseguibile a chi non ha MinGW il programma non funzionerà, e si dovrà procedere ad allegare tutte le dll necessarie all'eseguibile, normale per programmi complessi che accedono a risorse non standard, forzato per un programma console HelloWorld.


Ultima modifica effettuata da Carlo 17/01/21 13:25
in programmazione tutto è permesso
17/01/21 16:23
AldoBaldo
Nella mia cartella MinGW correntemente installata c'è libmingwex.a , ma nessun libmingwex.dll, libmingwex-4.dll, mingwex.dll o mingwex-4.dll

Non so individuare la versione di MinGW che ho installata, e non risulta disponibile il programma mingw-get.exe nella cartella del MinGW installato in Code::Blocks (e neppure in alcuna sottocartella). C'è, invece, in un'altra versione di MinGW più recente, che ho in C:\ ma che NON uso perché non mi riesce di configurare l'IDE in modo che l'accetti di buon grado (ho i miei limiti).

Uso ancora Code::Blocks 17.12 nella sua configurazione predefinita, e NON devo collegare nessuna libreria esterna perché funzionino i programmi per console in C, né in C++. Per creare i nuovi progetti uso il wizard incluso nel programma, e non ho modificato nulla rispetto alle impostazioni predefinite. La tua situazione è (per me) un bel mistero.

Comunque sia, per collegare staticamente le librerie io uso il menù Project->Build options... e imposto il nome della librerie nella scheda "Linker settings". Se il nome delle librerie è del tipo "libpincopallino.a", basta inserire "pincopallino". A seconda di dove si trovano i tuoi file potrebbe essere necessario anche modificare la scheda "Search directories", tanto nella sottoscheda "Linker" quanto in quella "Compiler", per segnalare il posto dove trovarli.

Edit: mi viene da chiederti ancora una cosa.
Quando crei un nuovo progetto, usi il wizard?
Io uso il menu File->New->Project... e dalla tabella "Projects" scelgo la categoria "Console application". Ho appena provato anche con "Empty project", e gli eseguibili che ne ricavo sono comunque regolarmente funzionanti anche senza collegare librerie "extra". Tu che categoria scegli, se usi il wizard?
Ultima modifica effettuata da AldoBaldo 17/01/21 16:30
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
17/01/21 23:21
Carlo
Postato originariamente da AldoBaldo:

Nella mia cartella MinGW correntemente installata c'è libmingwex.a , ma nessun libmingwex.dll, libmingwex-4.dll, mingwex.dll o mingwex-4.dll

Non so individuare la versione di MinGW che ho installata, e non risulta disponibile il programma mingw-get.exe nella cartella del MinGW installato in Code::Blocks (e neppure in alcuna sottocartella). C'è, invece, in un'altra versione di MinGW più recente, che ho in C:\ ma che NON uso perché non mi riesce di configurare l'IDE in modo che l'accetti di buon grado (ho i miei limiti).

Avevo anche io il MinGW "vecchio", non ero riuscito a configurarlo, il nuovo invece si, appena ha funzionato, non ho più cambiato.
Postato originariamente da AldoBaldo:
Uso ancora Code::Blocks 17.12 nella sua configurazione predefinita, e NON devo collegare nessuna libreria esterna perché funzionino i programmi per console in C, né in C++. Per creare i nuovi progetti uso il wizard incluso nel programma, e non ho modificato nulla rispetto alle impostazioni predefinite. La tua situazione è (per me) un bel mistero.

grazie lo stesso, quando ne saprò di più forse ci riderò sopra.

Postato originariamente da AldoBaldo:
Comunque sia, per collegare staticamente le librerie io uso il menù Project->Build options... e imposto il nome della librerie nella scheda "Linker settings". Se il nome delle librerie è del tipo "libpincopallino.a", basta inserire "pincopallino". A seconda di dove si trovano i tuoi file potrebbe essere necessario anche modificare la scheda "Search directories", tanto nella sottoscheda "Linker" quanto in quella "Compiler", per segnalare il posto dove trovarli.

farò una prova

Postato originariamente da AldoBaldo:
Edit: mi viene da chiederti ancora una cosa.
Quando crei un nuovo progetto, usi il wizard?
Io uso il menu File->New->Project... e dalla tabella "Projects" scelgo la categoria "Console application". Ho appena provato anche con "Empty project", e gli eseguibili che ne ricavo sono comunque regolarmente funzionanti anche senza collegare librerie "extra". Tu che categoria scegli, se usi il wizard?

si uso il wizard, per ora i wizard che mi funzionano sono, tra parentesi il tempo dedicato ad implementare l'ambiente necessario:
console application (0')
Glut project (1/2 giornata di fatica)
OpenGL project (0')
Win32 GUI project (0')

i wizard che ho provato a far funzionre senza successo sono, tra parentesi il tempo dedicato per cercare di implementare l'ambiente necessario:
FLTK project (10')
GTK+ project (1 ora)
QT4 e QT5 (2 giorni)

i wizard non menzionati, non li ho presi in considerazione.


in programmazione tutto è permesso