Domanda [Linux] si può distribuire solo l'eseguibile?

Stato
Discussione chiusa ad ulteriori risposte.

SmartApp

Utente Gold
24 Aprile 2013
528
31
156
289
Ciao a tutti.
Avrei un dubbio da un po' di tempo quindi domando a chi è più esperto di me.
Io creo un programma (facciamo in C++) che sia compatibile solo per Linux e voglio distribuirlo a chiunque lo volesse.
C'è modo di farlo funzionare inviando solo l'eseguibile senza il codice sorgente e tutte le altre cose?
Se non si può, in che modo posso proteggere il mio codice magari rendendolo readonly?
 
Ultima modifica:
Durante la fase di compilazione si passa per un processo chiamato linking, in poche parole questa fase serve per prendere tutte le dipendenze del programma (libreria x, libreria y e libreria z) e fare in modo che l'eseguibile sia in grado di trovarle. Esistono due tipi di linking: statico e dinamico. Il linking dinamico fa uso di files esterni (i famosi .dll di windows e i .o di linux), il linking statico invece mette tutto dentro l'eseguibile (di contro hai un file più pesante).
Se compili il tuo eseguibile in modo statico il tuo questo funziona ovunque (architettura e sistema operativo permettendo), se lo compili in modo dinamico devi assicurarti che chi lo andrà ad aprire abbia anche gli altri file necessari. E questa è pura teoria, non cambia niente se hai windows o linux, funziona allo stesso modo.

In pratica se non usi librerie esterne basta compilare normalmente (se usi gcc: "gcc -o nome_eseguibile nome_file.c") e passare l'eseguibile, devi solo assicurarti che chi lo andrà ad aprire abbia i permessi sufficienti per eseguirlo. Prova a passarlo così come esce (compilandolo come user ovviamente) e vedi se funziona. Da me esce con i permessi di esecuzione su tutti, quindi dovrebbe andare, in caso non andasse prova a sbloccarlo completamente con "chmod 777 nome_eseguibile".

Se usi librerie (non header!) esterne dimmelo che approfondisco.
 
Allora devi prendere i file .a e passarli al compilatore, i file che ti servono sono questi qui (dovrebbe cambiare solo l'estensione) e dovresti trovarli in un percorso tipo /lib/allegro/qualcosa. Per compilare il tutto credo che basti lanciare un comando del tipo: gcc -static /percorso/lib1.a /percorso/lib2.b -o eseguibile file.c
Purtroppo su linux non ho mai avuto l'occasione di farlo, quindi non sono così sicuro che funzioni, però ho provato con una lib random tra quelle che avevo già in mezzo all'hard disk e sembra andare.

Se per compilare non usi la linea di comando (aka usi un IDE) devi ravanare tra le proprietà del progetto, teoricamente dovrebbe essere abbastanza intuitivo, soprattutto se hai già trovato il modo per passargli i .so necessari per il linking dinamico (sempre se su linux sia necessario farlo, vista la struttura delle directory può essere che sia un processo automatizzato).

Altrimenti puoi sempre dire "installati le allegro5" a chi passi il file e passargli l'eseguibile (con le relative risorse [sprite, audio, etc.]) che hai ora.
 
penso di aver capito. Domani mattina provo e ti dico.

L'altra opzione è di passare tutti i .o (parlando in ambiente linux) e l'eseguibile compilato dinamicamente? Serve anche altro come le cartelle con le immagini di sprite, sfondo ecc ecc?
 
Non ne sono sicuro, ma mi pare che su linux, a differenza di windows, non venga effettuata una ricerca delle librerie dinamiche nella stessa cartella dell'eseguibile. Quindi molto probabilmente passare i .so (prima mi era sfuggita la s) non serve a niente.
Tutta la roba che richiami esplicitamente nel codice (es. immagini, file di configurazione, tracce audio, ecc...) non vengono inclusi nell'eseguibile, quindi vanno passati. Ovviamente non devi usare i percorsi completi, sul pc di chi userà quel file non è detto che esista il percorso /home/fattidare/Desktop/Immagini .
 
Non ci sto saltando fuori con questa compilazione statica. Ti scrivo il Make che uso per compilare tutti i file sorgente in modo dinamico.
Dimmi tu cosa devo fare per poterlo compilare staticamente.

Codice:
CQUAKE: CQUAKE.o Ringraziamenti.o mod_normale.o Gioco.o mod_salumi.o
	g++ -o CQUAKE CQUAKE.o Ringraziamenti.o mod_normale.o Gioco.o mod_salumi.o `allegro-config --libs`


CQUAKE.o: CQUAKE.cc ../Header/Strutt_dati.h
	g++ -c CQUAKE.cc `allegro-config --libs`


Ringraziamenti.o: Ringraziamenti.cc ../Header/Strutt_dati.h
	g++ -c Ringraziamenti.cc `allegro-config --libs`


mod_normale.o: mod_normale.cc ../Header/Strutt_dati.h
	g++ -c mod_normale.cc `allegro-config --libs`
	
Gioco.o: Gioco.cc ../Header/Strutt_dati.h
	g++ -c Gioco.cc `allegro-config --libs`
	
mod_salumi.o: mod_salumi.cc ../Header/Strutt_dati.h
	g++ -c mod_salumi.cc `allegro-config --libs`
	
.PHONY: debug depend clean cleanall


depend:
	g++ -MM *.cc > dependencies


clean:
	rm *.o
	
cleanall:
	rm CQUAKE *.o
	rm DEBUG_FILE.txt
	
debug: CQUAKE.o Ringraziamenti.o mod_normale.o Gioco.o mod_salumi.o
	g++ -D DEBUG_MODE -g -o CQUAKE CQUAKE.cc Ringraziamenti.cc mod_normale.cc Gioco.cc mod_salumi.cc `allegro-config --libs`
	rm DEBUG_FILE.txt
 
Non ho mai usato Make, quando faccio un progetto semi-serio vado su Windows, sono abituato ad usare Visual Studio.
 
In visual studio linko le librerie statiche e cambio un paio di opzioni in modo che il compilatore mi faccia una compilazione statica (se vuoi una guida step by step c'è un link in un mio post precedente), in caso non ci sono le librerie statiche devi ricompilarle (me la sono sempre cavata con cmake gui).
Devi fare così ovunque, solo che con visual studio mi è capitato più volte di usare librerie esterne, quindi so dove cercare quello che mi interessa. In linux non uso nemmeno un ide, vado di vim + gcc/clang, tanto quando programmo su linux è solo per aiutare qualcuno del forum o per fare cagate, se devo fare qualcosa di più impegnativo riavvio su windows e uso visual studio. Fatto sta che ho provato il comando che ti ho scritto prima e ha funzionato.

Tiro a indovinare: c'è quel "allegro-confing --libs" che penso serva a linkare le librerie dinamiche di allegro, forse esiste un comando simile anche per le librerie statiche, altrimenti devi trovare il modo di crearti tu un comando del genere (di sicuro si può fare, altrimenti non esisterebbe nemmeno quello). Oltre a questo devi mettere il -static da qualche parte (dopo tutti i g++ forse, o forse solo sulla penultima riga) nel tuo makefile.
 
esatto, il "allegro-config --libs" permette di linkare le librerie di allegro e secondo me il mio problema è proprio dire di linkare staticamente quelle librerie.
Ho provato usando il -static (subito dopo il g++) in tutte le righe in cui lo invoco esclusa l'ultima dove c'è il phony target "debug:" ma non basta.
La terzultima e penultima riga compilano il codice in modo che sia attivata la modalità debug, ovvero che se scrivo una certo comando da shell mi permette di aprire l'eseguibile con il ddd (un tipo di debugger di linux)
 
esatto, il "allegro-config --libs" permette di linkare le librerie di allegro e secondo me il mio problema è proprio dire di linkare staticamente quelle librerie.
Ho provato usando il -static (subito dopo il g++) in tutte le righe in cui lo invoco esclusa l'ultima dove c'è il phony target "debug:" ma non basta.
No che non basta, anche le librerie (quelle già compilate) che vai a linkare devono essere statiche, ci devono essere proprio dei file (.a) diversi da linkare. Mentre con la compilazione dinamica puoi permetterti di linkare anche la roba che non usi, con quella statica è bene linkare solo lo stretto indispensabile, altrimenti ci metti niente a fare un eseguibile di decine di MB.
Io proverei a togliere quel "allegro-config --libs" e scriverei al suo posto uno ad uno i .a che andrai ad usare (rivedi i post precedenti per sapere il nome dei file).
 
Stato
Discussione chiusa ad ulteriori risposte.