Visualizzazione post con etichetta gcc. Mostra tutti i post
Visualizzazione post con etichetta gcc. Mostra tutti i post

lunedì 4 novembre 2019

Librerie con buildroot

per continuare il post precedente volevo provare a cross compilare  linkando delle librerie dinamiche.
Il progetto Buildroot rende disponibile un plugin per Eclipse ma e' disponibile solo per Eclipse Luna mentre attualmente e' disponibile la versione 2019 (dove il plugin non funziona)



Se si prova  scaricare Eclipse Luna e si cerca di esesguirlo su una Debian 11 non fuzionera' perche' necessita di JDK 11 (su Debian Java 8 e' stato rimosso e di default e' disponibile Java 11).
Non e' possibile usare i repository ufficiali per fare il downgrade per cui' ci si deve appoggiare ad un repository esterno con in comandi


sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 0xB1998361219BD9C9 
echo "deb http://repos.azulsystems.com/debian stable main" | sudo tee /etc/apt/sources.list.d/zulu.list
apt-get install zulu-8

fatto cio' In Help/Install New Software di Eclipse di aggiunge il link

http://buildroot.org/downloads/eclipse/luna

e si installa il plugin Buildroot

Come esempio si puo' provare a linkare in modo dinamico la libreria ZLib
Da make menuconfig di BuildRoot si spunta Register Toolchain within Eclipse dal menu Toolchain


dopo di cio' Target packages/Libraries/Compression/ si seleziona Zlib

si esce si effettua il make

Si ritorna ad Eclipse File/New/Project/Empty Project/Buildroot MIPS e si crea un nuovo file incollando questo esempio https://github.com/madler/zlib/blob/master/test/example.c

Per abilitare la libreria si va in Project Settings/C C++ Build/Settings e si scorre verso destra dal tab Tool Settings fino a trova Pkg-config e si seleziona zlib



L'eseguibile compilato (con il comando file) dovra' contenere la seguente stringa
h5: ELF 32-bit MSB executable, MIPS, MIPS32 version 1 (SYSV), dynamically linked, interpreter /lib/ld-uClibc.so.0, with debug_info, not stripped

Si fa quindi Build e si sposta il progetto sulla Arduino Yun in scp, si cambiano i permessi per l'esecuzione

warning: different zlib version
zlib version 1.2.11 = 0x12b0, compile flags = 0x55
uncompress(): hello, hello!
gzread(): hello, hello!
gzgets() after gzseek:  hello!
inflate(): hello, hello!
large_inflate(): OK
after inflateSync(): hello, hello!
inflate with dictionary: hello, hello!
root@Yun2:~# ldd ./h5
libz.so.1 => /usr/lib/libz.so.1 (0x77124000)
libc.so.0 => /lib/libc.so.0 (0x770b8000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x77095000)
ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0x77146000)

una volta in esecuzione il programma gira anche se si lamenta di una differenza di librerie tra quella linkata da buildroot e quella effettivamente presente sulla Yun

Se si prova a compilare con ncurses la cosa diventa piu' seria perche' buildroot linka contro ncurses 6 mentre su Yun opkg rende disponibili libncurses 5.7.5 ed il programma non si avvia 

martedì 16 aprile 2019

Classi in C++ con CMake ed Eclipse

Questa cosa di CMake mi sta iniziando a dare fastidio....(devo ogni volta capire come sono cambiate le cose rispetto a make)

Diciamo di avere questa stupida classe
schermo.cpp
---------------------------------------------------
#include "schermo.h"

void schermo::aggiorna()
{
schermo::matrice[1] = 100;
}

schermo::schermo() {
schermo::matrice[1]=0;
}

schermo::~schermo() {
}
------------------------------------------------------

schermo.h
------------------------------------------------------
#ifndef SCHERMO_H_
#define SCHERMO_H_

class schermo {
public:
schermo();
void aggiorna();
virtual ~schermo();
int matrice [100];
private:

};

#endif /* SCHERMO_H_ */
------------------------------------------------------

ed un altro altrettanto stupido codice che chiama la classe
ad.cpp
------------------------------------------------------
#include <iostream>
#include <string>
#include "schermo.h"

using namespace std;

schermo ss;

int main(int argc, char **argv) {
int numero = ss.matrice[1];
auto s = std::to_string(numero);
cout << s << endl;
ss.aggiorna();
numero = ss.matrice[1];
s = std::to_string(numero);
cout << s << endl;
return 0;
}
------------------------------------------------------

per compilare la classe nella liberia esterna si deve modificare il file CMakeLists.txt come segue nella parte evidenziata (cioe' richiamando sia il sorgente che l'header della classe)

------------------------------------------------------
cmake_minimum_required (VERSION 2.6)

project (ad)

add_executable(ad ad.cpp schermo.cpp schermo.h)

------------------------------------------------------


lunedì 16 maggio 2016

Opzioni di compilazione gcc in Eclipse e Netbeans

Un promemoria su come configurare gli switch di compilazione di gcc con Eclipse e Netbeans
In entrambi i casi si deve cliccare destro sul nome del progetto ed aprire le proprieta'

Eclipse

Optimizzazione e debug -O3 -Wall

 Include switch -I
Per lo switch -lm per esempio si scrive sono m omettendo -l
Library switch -l -L


Netbeans

Inclusione di librerie ed headers


Per aggiungere lo switch -l in Netbeans si apre Add Option/Other Option e si digita lo switch completo (al contrario di Eclipse)


giovedì 12 maggio 2016

Abilitare il core dump su gcc

Nelle distro attuali di Linux all'utente normale viene disabilitata la possibilita' di scrivere un core dump nel caso di crash di una applicazione (tanto non saprebbe come cosa farsene)




Quando invece si sta sviluppando un programma e' molto utile avere a disposizione un core dump. Si puo' abilitare con il comando

ulimit -c unlimited

per debuggare il core dump si usa
gdb nome_programma  nome_core_dump
con subito dopo il comando di backtrace
bt

martedì 19 febbraio 2013

C4Droid

C4Droid e' la prima applicazione in assoluto che abbia acquistato (2.29 euro) e devo ammettere che ne vale la pena

L'applicazione permette di programmare all'interno di un terminale Android in C/C++ con Gcc come compilatore ed con alcune librerie di uso comune all'interno di Linux come SDL e Qt. In questo modo ci si svincola dall'impiego di Java e dalla macchina virtuale Dalvik per fare applicazione di livello piu' basso come e' possibile fare con l'NDK

Per mettere alla prova il compilatore ho preso il sorgente del post che permette di disegnare l'insieme di Mandelbrot




Il codice e' stato copiato ed incollato senza nessuna modifica, quindi compilato ed eseguito

Il risultato e' riportato nella immagine sottostante


Come si puo' osservare il risultato e' quello atteso. Il tempo di esecuzione, che su un pc attuale non e' quasi misurabile dato che il risultato e' quasi istantaneo, nel telefono Samsung GT-S5570i e' di circa 18 secondi

Con lo stesso compilatore si puo' usare Ncurses. Sempre prendendo a prestito da un precedente post si puo' ottenere


La cosa divertente e' che con questo compilatore si riesce a superare il controllo della latenza di Dalvik. In pratica di norma Android interrompe una applicazione se questa per circa 30 secondi non restituisce la possibilita' di interazione all'utente

L'immagine sottostante e' stata effettuata mediante un calcolo di circa 2 minuti e 25 secondi ed e' stata terminata senza nessuna segnalazione di anomalia da parte del sistema operativo





Un buon acquisto in fine dei conti anche se in fine dei conti si tratta di un giochino piu' che di uno strumento di produzione

lunedì 5 novembre 2012

Primi passi in Assembler su Linux


piu' che altro per divertimento ho provato a riscrivere qualcosa in assembler..era dai tempi del DOS e di Int 21h che non usavo piu' l'assembler
E' curioso ritrovare che anche Linux come Dos usa un interrupt (80h) per la gestione del sistema ed e' anche curioso di come si possano usare le chiamate alle funzioni C (in questo caso printf) dall'Assembler (di solito e' il linguaggio di piu' alto livello che sfrutta quello di livello piu' basso)

Tutti gli esempi sono compilati con nasm

Il primo esempio stampa una scritta a video usando l'Int 80h
Per la compilazione si devono dare i seguenti comandi
nasm -f elf32 scrivi.asm
ld -o scrivi scrivi.o

scrivi.asm
-------------------------------------------------------
global _start

section .text
_start:
    mov eax,4
    mov ebx,1
    mov ecx,messaggio
    mov  edx,lunghezza
    int 80h

    mov eax,1
    mov ebx,0
    int 80h

section .data
    messaggio: db 'Hello ',0x0a
    lunghezza: equ $-messaggio


-------------------------------------------------------
come output si ha
Hello

Per il secondo esempio si usa invece la chiamata esterna printf per stampare il valore di una variabile

In questo caso la catena di compilazione e' differente per venire incontro alla chiamata esterna che e' risolta da gcc
nasm -f elf32 -l scrivi2.lst scrivi2.asm
gcc -o scrivi2 scrivi2.o

scrivi2.asm
-------------------------------------------------------
 extern printf

section .text

    global main
main:
    push ebp
    mov ebp,esp


    push dword [a]
    push dword formato
    call printf

    add esp,12

    mov esp,ebp
    pop ebp

    mov eax,0
    ret

section .data
    a: dd 5
    formato: db "a=%d",10,
0

-------------------------------------------------------
come output si ha
a=5

Molto simile al precedente il terzo esempio mostra un ciclo

nasm -f elf32 -l scrivi3.lst scrivi3.asm
gcc -o scrivi3 scrivi3.o

scrivi3.asm
-------------------------------------------------------
 extern printf

section .text

    global main
main:
    push ebp
    mov ebp,esp

    mov ebx,10
gira:
    push ebx
    push dword formato
    call printf
    dec ebx
    jnz gira
  

    mov esp,ebp
    pop ebp

    mov eax,0
    ret

section .data
    formato: db "ciclo=%d",10,0

-------------------------------------------------------

produce come output
ciclo=10
ciclo=9
ciclo=8
ciclo=7
ciclo=6
ciclo=5
ciclo=4
ciclo=3
ciclo=2
ciclo=1





venerdì 12 ottobre 2012

Zlib

La libreria Zlib permette la compressione con un metodo simile (ma non uguale all'algoritmo LZW) a quello dei file Zip

per la compilazione si deve utilizzare la stringa sottostante
gcc -Wall -O3 -lz zlib_test.c -o zlib_test

per comprimere i file si utilizza il seguente codice
-----------------------------------------------------
 FILE *infile = fopen(infilename, "rb");
gzFile outfile = gzopen(outfilename, "wb");

char inbuffer[128];
while ((num_read = fread(inbuffer, 1, sizeof(inbuffer), infile)) > 0) {
      gzwrite(outfile, inbuffer, num_read);
}
fclose(infile);
gzclose(outfile);

-----------------------------------------------------

 mentre questo e' per decomprimere un file
-----------------------------------------------------
 gzFile infile = gzopen(infilename, "rb");
FILE *outfile = fopen(outfilename, "wb");

char buffer[128];
while ((num_read = gzread(infile, buffer, sizeof(buffer))) > 0) {
fwrite(buffer, 1, num_read, outfile);
}

gzclose(infile);
fclose(outfile);

-----------------------------------------------------

mercoledì 3 ottobre 2012

GCC vs CLang vs ICC

Mi sono incuriosito del progetto LLVM/CLang ed ho voluto metterlo alla prova in confronto con Gcc e Icc utilizzando quanto gia' scritto in questo post

Immagine ripresa da Google Images



Di seguito i risultati
Gcc

real 0m1.613s
user 0m0.956s
sys 0m0.028s

Icc (Intel compiler)

real 0m1.064s
user 0m0.632s
sys 0m0.024s

CLang

real 0m0.983s
user 0m0.588s
sys 0m0.028s


In conclusione Gcc ne esce sempre con le ossa rotte ...c'e' da dire tuttavia che CLang e' un progetto piuttosto giovane e non permette di fare tutto cio' che e' possibile con Gcc



venerdì 28 settembre 2012

Intel C Compiler vs GCC in Mandelbrot

Ho provato a verificare la differenza tra Gcc ed il compilatore Intel C++ (icc) per quanto riguarda la velocita' e l'ottimizzazione dei calcoli
Per fare cio' e' stato impiegato il programma per generare l'insieme di Mandelbrot gia' presentato in un precedente post usando gli stessi switch di compilazione all'interno del file make



Makefile
------------------------------------------------------
main: mand_sdl.c
    /opt/intel/bin/icc -Wall -O3 mand_sdl.c -o mand_sdl_icc -lSDL
    gcc -Wall -O3 mand_sdl.c -o mand_sdl_gcc -lSDL

------------------------------------------------------

Il programma e' il seguente
 mand_sdl.c
------------------------------------------------------
 #include "SDL/SDL.h"
#include <stdio.h>

#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
#define SCREEN_DEPTH 8

float re_min = -2.0;
float im_min = -1.2;

float re_max = 1.0;
float im_max = 1.2;
int iterazioni = 255;


float a,b;
float x,y,x_new,y_new;

int test;

int k,j,i;

int keypress = 0;


int main() {

SDL_Surface *screen;
Uint8       *p;

float re_factor = (re_max-re_min);
float im_factor = (im_max-im_min);
   
SDL_Init(SDL_INIT_VIDEO);
screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_DEPTH, SDL_SWSURFACE);

for (i=0;i<SCREEN_HEIGHT;i++)
    {
    for (j=0;j<SCREEN_WIDTH;j++)
        {
        a = re_min+(j*re_factor/SCREEN_WIDTH);  
        b = im_min+(i*im_factor/SCREEN_HEIGHT);
      
        x = 0;
        y = 0;
        test = 0;
      
        for (k=0;k<iterazioni;k++)
            {
            x_new = (x*x)-(y*y)+a;
            y_new = (2*x*y)+b;
            if (((x_new*x_new)+(y_new*y_new))>4)
                {
                test = k;
                p = (Uint8 *)screen->pixels + i * screen->pitch + j * screen->format->BytesPerPixel;
                *p=(k%255);
                break;
                }
            x = x_new;
            y = y_new;
            }
          
        }

    }
SDL_Flip(screen);

printf("Finito\n\r");

SDL_Quit();

return(0);

}


------------------------------------------------------
Per calcolare il tempo di esecuzione e' stato usato il comando time che misura il tempo tra l'inizio e la fine dell'esecuzione

time  mand_sdl_gcc
time mand_sdl_icc

i risultati sono decisamente schiaccianti. Intel vince in velocita'

Intel
Totale 0.974
User   0.624
Sys    0.024

Gcc
Totale 1.325
User   0.948
Sys    0.020


Link al progetto

lunedì 3 settembre 2012

Compilare GTK in Code::Blocks in Debian

Come compilare GTK con Code::Blocks sotto Debian
(attenzione agli apici che sono inversi)

Compiler
-------------------------------------------------
`pkg-config –cflags gtk+-2.0 gmodule-export-2.0`
`pkg-config –cflags libglade-2.0`


Linker
--------------------------------------------------------------
`pkg-config –libs gtk+-2.0 gmodule-export-2.0`
`pkg-config –libs libglade-2.0`


altrimenti a linea di comando
gcc `pkg-config –cflags libglade-2.0 –libs gtk+-2.0` `pkg-config –libs gtk+-2.0 gmodule-export-2.0` main.c

Compilare ncurses e cdk


Esempi di compilazione di sorgenti ncurses e cdk sotto Debian

per entrambe le librerie si possono scaricare i pacchetti gia' compilati (sia libreria che dev)

Nel caso di ncurses
gcc -Wall hello.c -l ncurses -o hello
---------------------------------------------------------------
#include <ncurses.h>

int main()
{
initscr(); /* Start curses mode  */
printw("Hello World !!!"); /* Print Hello World  */
refresh(); /* Print it on to the real screen */
getch(); /* Wait for user input */
endwin(); /* End curses mode  */

return 0;
}

---------------------------------------------------------------

Per compilare CDK si devono unire le librerie ncurses e cdk

gcc -Wall hello_ex.c -lcdk -lncurses -o hello_ex

(nel caso di Debian si deve modificare la riga di include presente nel pacchetto originale degli esempi di CDK per farlo puntare alla directory corretta ovvero #include <cdk.h> diventa #include <cdk/cdk.h>
---------------------------------------------------------------

#include <cdk/cdk.h>

int main (int argc, char **argv)
{
   CDKSCREEN *cdkscreen;
   CDKLABEL *demo;
   WINDOW *cursesWin;
   const char *mesg[4];

   CDK_PARAMS params;

   CDKparseParams (argc, argv, &params, CDK_MIN_PARAMS);

   /* Set up CDK. */
   cursesWin = initscr ();
   cdkscreen = initCDKScreen (cursesWin);

   /* Start CDK Colors. */
   initCDKColor ();

   /* Set the labels up. */
   mesg[0] = "</5><#UL><#HL(30)><#UR>";
   mesg[1] = "</5><#VL(10)>Hello World!<#VL(10)>";
   mesg[2] = "</5><#LL><#HL(30)><#LR>";

   /* Declare the labels. */
   demo = newCDKLabel (cdkscreen,
      CDKparamValue (&params, 'X', CENTER),
      CDKparamValue (&params, 'Y', CENTER),
      (CDK_CSTRING2) mesg, 3,
      CDKparamValue (&params, 'N', TRUE),
      CDKparamValue (&params, 'S', TRUE));

   setCDKLabelBackgroundAttrib (demo, COLOR_PAIR (2));


   /* Draw the CDK screen. */
   refreshCDKScreen (cdkscreen);
   waitCDKLabel (demo, ' ');

   /* Clean up. */
   destroyCDKLabel (demo);
   destroyCDKScreen (cdkscreen);
   endCDK ();
return(0);
   //ExitProgram (EXIT_SUCCESS);
}
---------------------------------------------------------------

In Code::Blocks gli switch di compilazione si devono inserire come nell'esempio riportato in immagine



Geologi

  E so anche espatriare senza praticamente toccare strada asfaltata